BTree.h   (结构定义, 基本操作, 遍历)

  1. #define MS 10
  2.  
  3. typedef struct BTreeNode{
  4. char data;
  5. struct BTreeNode * left
  6. struct BTreeNode * right;
  7. }BTreeNode;
  8.  
  9. BTreeNode* InitBTree();
  10. /*初始化二叉树,即把树根指针置空*/
  11. BTreeNode* CreateBtree(char *a);
  12. /*根据a所指向的二叉树广义表字符串建立对应的存储结构,返回树根指针*/
  13. int BTreeEmpty(BTreeNode* BT);
  14. /*判断一颗二叉树是否为空,若是则返回1,否则返回0*/
  15. void Preorder(BTreeNode * BT);
  16. /*先序遍历的递归算法*/
  17. void Inorder(BTreeNode * BT);
  18. /*中序遍历的地鬼算法*/
  19. void Postorder(BTreeNode * BT);
  20. /*后序遍历的递归算法*/
  21. void Levelorder(BTreeNode* BT);
  22. /*按层遍历由BT指针所指向的二叉树*/
  23. void Inorder(BTreeNode* BT);
  24. /*对二叉树进行中序遍历的非递归算法*/
  25. int BTreeDepth(BTreeNode * BT);
  26. /*求BT指向的一颗二叉树深度*/
  27. char* FindBTree(BTreeNode * BT, char x);
  28. /*从BT所指向的二叉树中查找值为x的节点*/
  29. void PrintBTree(BTreeNode* BT);
  30. /*输出二叉树的广义表表示*/
  31. BTreeNode* ClearBTree(BTreeNode* BT);
  32. /*清除二叉树中的所有节点,使之成为一颗空树*/

BTree.c   (二叉树的接口实现)

  1. void Preorder(BTreeNode * BT){
  2.  
  3. if(BT != NULL){
  4. putchar(BT->data); //访问根节点
  5. Preorder(BT->left); //先序遍历左子树
  6. Preorder(BT->right); //先序遍历右子树
  7. }
  8. }
  9.  
  10. void Inorder(BTreeNode * BT){
  11. if(BT != NULL){
  12. Inorder(BT->left); //中序遍历左子树
  13. putchar(BT->data); //访问根节点
  14. Inoreder(BT->right); //中序遍历右子树
  15. }
  16. }
  17.  
  18. void InorderN(BTreeNode* BT){
  19. /*对二叉树进行中序遍历的非递归算法*/
  20. BTreeNode* s[]; //定义用于存储节点指针的栈
  21. int top = -; //定义栈顶指针并赋初值使s栈为空
  22. BTreeNode* p = BT; //定义指针p并使树根指针为它的初值
  23. while(top != - || p != NULL){
  24. /*当栈非空或p指针非空时执行循环*/
  25. while(p != NULL){
  26. /*依次向下访问左子树并使树根指针进栈*/
  27. top++;
  28. s[top] = p;
  29. p = p->left;
  30. }
  31. if(top != -){
  32. /*树根指针出栈并输出节点的值,接着访问右子树*/
  33. p = s[top];
  34. top--;
  35. putchar(p->data);
  36. p = p->right;
  37. }
  38. }
  39. }
  40. void Postorder(BTreeNode * BT){
  41. if(BT != NULL){
  42. Postorder(BT->left); //后序遍历左子树
  43. Postorder(BT->right); //后序遍历右子树
  44. putchar(BT->data); //访问根节点
  45. }
  46. }
  47. void Levelorder(BTreeNode* BT){
  48. /*按层遍历由BT指针所指向的二叉树*/
  49. /*定义队列所使用的数组空间,元素类型为指向节点的指针类型*/
  50. BTreeNode* q[MS]; //MS为事先定义的符号常量
  51. /*定义队首指针和队尾指针,初始均置0表示空队*/
  52. int front = , rear = ;
  53. /*将树根指针进队*/
  54. if(BT != NULL
  55. rear = (rear + ) % MS;
  56. q[rear] = BT;
  57. }
  58. /*当队列非空时执行循环*/
  59. while(front !- rear){
  60. BTreeNode* p; //定义指针变量p
  61. /*使队首指针指向队首
  62. BTreeNode* InitBTree(){
  63. /*初始化二叉树,即把树根指针置空*/
  64. return NULL;
  65. }
  66.  
  67. BTreeNode* CreateBtree(char *a){
  68. /*根据a所指向的二叉树广义表字符串建立对应的存储结构,返回树根指针*/
  69. BTreeNode * p = NULL;
  70. /*定义S数组作为存储根节点指针的栈使用*/
  71. BTreeNode* S[MS]; //MS事先定义的符号常量
  72. /*定义top作为S栈的栈顶指针,初值为-1,表示空栈*/
  73. int top = -;
  74. /*用k作为处理节点的左子树和右子树的标记,k=1处理左子树,k=2处理右子树*/
  75. int k;
  76. /*用i扫描数组a中存储的二叉树广义表字符串,初值为0*/
  77. int i = ;
  78. /*把树根指针置为空,即从空树开始建立二叉树,待建立二叉树结束后返回*/
  79. BTreeNode BT = NULL;
  80. /*每循环一次处理一个字符,知道扫描到字符串结束符'\0’为止*/
  81. while(a[i]){
  82. switch(a[i]){
  83. case ' ':/*对空格不做任何处理,退出此switch语句*/
  84. case '(':
  85. if(top == MS-){
  86. printf("栈空间太小,需增加MS的值!\n");
  87. exit();
  88. }
  89. if(p == NULL){
  90. printf("p值不能为空,退出程序!\n");
  91. exit();
  92. }
  93. top++;
  94. s[top] = p;
  95. k = ;
  96. p = NULL;
  97. break;
  98. case ')':
  99. if(top == -){
  100. printf("二叉树广义表字符串有错!\n");
  101. exit();
  102. }
  103. top--;
  104. break;
  105. case ',':
  106. k = ;
  107. break;
  108. default:
  109. if((a[i] >= 'a' && a[i] <= 'z' || a[i] >= 'A' && a[i] <= 'Z')){
  110. p = malloc(sizeof(BTreeNode));
  111. p->data = a[i];
  112. p->left = p->right = NULL;
  113. if(BT == Null) BT = P;
  114. else{
  115. if(k == )s[top]->lef = p;
  116. else s[top]->right = p;


  117. else{
  118. printf("广义表字符串出错!\n");
  119. exit();
  120. }
  121. }
  122. /*为扫描下一个字符修改i值*/
  123. i++;
  124. }
  125. return BT;
  126. }
  127. int BTreeEmpty(BTreeNode* BT){
  128. /*判断一颗二叉树是否为空,若是则返回1,否则返回0*/
  129. if(BT== NULL) return
  130. else return ;
  131. }
  132.  
  133. int BTreeDepth(BTreeNode * BT){
  134. /*求BT指向的一颗二叉树深度*/
  135. if(BT != NULL) return ;
  136. else{
  137. /*计算左子树深度*/
  138. int dep1 = BTreeDepth(BT->left);
  139. /*计算右子树深度*/
  140. int dep1 = BTreeDepth(BT->right);
  141.  
  142. /*返回树的深度*/
  143. if(dep1 > dep2) return dep1 + ;
  144. else return dep2 + ;
  145. }
  146. }
  147.  
  148. char* FindBTree(BTreeNode * BT, char x){
  149. /*从BT所指向的二叉树中查找值为x的节点*/
  150. if(BT == NULL) return NULL;
  151. else{
  152. /*树节点的值等于x则返回元素地址*/
  153. if(BT->data == x) return &(BT->data);
  154. else{
  155. char* p;
  156. /*向左子树查找若成功则继续返回元素的地址*/
  157. if(p = FindBTree(BT->left,x)) return p;
  158. /*向右子树查找若成功则继续返回元素的地址*/
  159. if(p = FindBTree(BT->right,x)) return p;
  160. /*左右子树查找均失败则返回空*/
  161. return NULL;
  162. }
  163. }
  164. }
  165.  
  166. void PrintBTree(BTreeNode* BT){
  167. /*输出二叉树的广义表表示*/
  168. /*树为空时自然结束递归,否则执行如下操作*/
  169. if(BT != NULL){
  170. /*输出根节点的值*/
  171. putchar(BT->data);
  172. /*输出左右子树*/
  173. if(BT->left != NULL || BT->right != NULL){
  174. putchar('('); //输出左括号
  175. PrintBTree(BT->left); //输出左子树
  176. if(BT->right != NULL) putchar(','); //若右子树不为空则输出逗号分隔符
  177.  
  178. PrintBTree(BT -> right); //输出右子树
  179. putchar(')'); //输出右括号
  180. }
  181. }
  182. }
  183.  
  184. BTreeNode* ClearBTree(BTreeNode* BT){
  185. if(BT == NULL) return NULL;
  186. else{
  187. ClearBTree(BT->left); //删除左子树
  188. ClearBTree(BT->right); //删除右子树
  189. free(BT); //释放根节点
  190. return NULL; //返回空指针
  191. }
  192. }

BTreeTest.c   (二叉树运算调试程序)

  1. #include "BTree.h"
  2.  
  3. int main(void){
  4. BTreeNode *p;
  5. char *k;
  6. int n1;
  7. char *a = "A(B(C),D(E(F,G),H(,I)))";
  8. P = InitBTree(); //建立空树
  9. p = CreateBTree(a); //按照广义表形式的二叉树建立二叉链表
  10. Preorder(p); putchar('\n'); //先序遍历
  11. Inorder(p) putchar('\n'); //中序遍历
  12. Postorder(p) putchar('\n'); //后序遍历
  13. Levelorder(p) putchar('\n'); //按层遍历
  14. InorderN(p) putchar('\n'); //中序非递归遍历
  15. printf("%d\n",BTreeDepth(p)); //求二叉树深度
  16. k = FindBTree(p, 'I'); if(k!=NULL) printf("%c\n", *k); //查找二叉树
  17. PrintBTree(p); //输出二叉树
  18. p = ClearBTree(p); //清空二叉树
  19. n1 = BTreeEmpty(P); printf("%d\n", n1); //判断树是否为空
  20.  
  21. }

二叉树 ADT接口 遍历算法 常规运算的更多相关文章

  1. Python -二叉树 创建与遍历算法(很详细)

    树表示由边连接的节点.它是一个非线性的数据结构.它具有以下特性. 一个节点被标记为根节点. 除根节点之外的每个节点都与一个父节点关联. 每个节点可以有一个arbiatry编号的chid节点. 我们使用 ...

  2. 图 ADT接口 遍历运算 常规运算 邻接矩阵实现

    Graph.h   (图的结构, 遍历, 常规操作接口) /*定义图的最大定点数, 它要大于等于具体图的顶点树n*/ #define MaxVertexNum 12 /*定义图的最大边数,它要大于等于 ...

  3. Go语言二叉树定义及遍历算法实现

    // binary_tree 二叉树 package Algorithm import ( "reflect" ) // 二叉树定义 type BinaryTree struct ...

  4. [LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

    描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \ 9 20 / \ 15 7 返回他的分层遍历结果: [ [3] ...

  5. 算法学习笔记(六) 二叉树和图遍历—深搜 DFS 与广搜 BFS

    图的深搜与广搜 复习下二叉树.图的深搜与广搜. 从图的遍历说起.图的遍历方法有两种:深度优先遍历(Depth First Search), 广度优先遍历(Breadth First Search),其 ...

  6. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  7. 毕业了-java二叉树层次遍历算法

    /*************************************** * 时间:2017年6月23日 * author:lcy * 内容:二叉树的层次遍历 * 需要借助队列这个数据结构,直 ...

  8. 算法 dfs —— 将二叉树 先序遍历 转为 链表

    将二叉树拆成链表 中文English 将一棵二叉树按照前序遍历拆解成为一个 假链表.所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针. Example 样例 1: 输入: ...

  9. 算法:二叉树的层次遍历(递归实现+非递归实现,lua)

    二叉树知识参考:深入学习二叉树(一) 二叉树基础 递归实现层次遍历算法参考:[面经]用递归方法对二叉树进行层次遍历 && 二叉树深度 上面第一篇基础写得不错,不了解二叉树的值得一看. ...

随机推荐

  1. LNMP-day3-php扩展缓存插件

     perl的编译问题 [root@localhost php5.6.33]# echo 'export LC_ALL=C' >> /etc/profile #设置环境变量,解决后面perl ...

  2. http状态码汇总及问题经验总结

    我们经常会遇到404.500.302等提示,它们究竟是什么意思呢?除了这几个常见的状态码外,还有哪些我们没有遇到过的但有可能出现的状态码呢?这里本人做了一个汇总,与大家分享一下. 常见的HTTP错误可 ...

  3. 深入浅出SharePoint——使用WinDbg进行调试

  4. iptables常用配置

    常用的iptables模板 #!/bin/sh iptables -F iptables -X iptables -F -t mangle iptables -t mangle -X iptables ...

  5. CS20Chapter3

    waiting  P54 shuffle data 03_Lecture note_Linear and Logistic Regression 学习点1: python的地址输入是要不能用正斜杠\的 ...

  6. Week7:SVM难点记录

    1.函数dataset3Params(),如何计算模型估计偏差的? model=svmTrain(X,y,c_array,@(x1,x2)gaussianKernel(x1,x2,sigma_arra ...

  7. Spring中使用属性文件properties的两种方式

    实际项目中,通常将可配置的参数放到属性文件中,例如数据库连接信息.redis连接信息等,便于统一管理.然后通过IoC框架spring将其加载到上下文中,使得程序可以直接使用. 创建mysql.prop ...

  8. Selenium自动化测试之基本控件使用

    Selenium自动化测试之基本控件使用 1.输入框input: 在Html中样式: <input id="username" type="text"&g ...

  9. 使用Docker发布.NET CORE API

    1.使用VS 2015 新建了一个Core API项目,然后把他的依赖升级到最新(我机器VS 2015默认的包都是rc版本),然后publish. 2.在publish目录的同级目录下,新建Docke ...

  10. Vue学习—Vue写一个图片轮播组件

    1.先看效果: 熟悉的图片轮播,只要是个网站,百分之90以上会有个图片轮播.我认为使用图片轮播. 第一可以给人以一种美观的感受,而不会显得网站那么呆板, 第二可以增加显示内容,同样的区域可以显示更多内 ...