C语言- 基础数据结构和算法 - 11 二叉树的递归遍历20220612

11 二叉树的递归遍历20220612,

听黑马程序员教程《基础数据结构和算法 (C版本)》,

照着老师所讲抄的, 视频地址https://www.bilibili.com/video/BV1vE411f7Jh?p=1

喜欢的朋友可以去看看,欢迎大家一起交流学习。

二叉树的递归遍历数出、计算叶子数量、计算深度

 

11 二叉树的递归遍历20220612_main.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 
  6 // 二叉树结点 
  7 typedef struct BINARYNODE{
  8     char ch;
  9     struct BINARYNODE* lchild;        // 左结点
 10     struct BINARYNODE* rchild;        // 右结点 
 11 }BinaryNode;
 12 
 13 // 叶子结点数
 14 int num = 0;
 15 // 递归计算叶子结点
 16 void CaculateLeafNum(BinaryNode* root){
 17     
 18     if(root==NULL){
 19         return;
 20     }
 21     
 22     // 没有子树的结点为叶子结点 
 23     if(root->lchild==NULL && root->rchild==NULL){
 24         num++;
 25     }
 26     
 27     // 递归 
 28     CaculateLeafNum(root->lchild);
 29     CaculateLeafNum(root->rchild);
 30     
 31 } 
 32 
 33 // 递归计算深度
 34 int PostTreeHeight(BinaryNode* root){
 35     
 36     int h = 0,hl=0,hr=0;        // 总高度,左高度,右高度
 37     if(root==NULL){
 38         return h;
 39     }else{
 40         hl = PostTreeHeight(root->lchild);    // 递归遍历左子树
 41         hr = PostTreeHeight(root->rchild);    // 递归遍历右子树
 42         h = (hr>hl)?hr+1:hl +1;    
 43         // 三目运算符
 44         // 如果hr>hl,则取hr的值,然后hr+1赋值给h
 45         // 如果hr<hl,则取hl的值,然后hl+1赋值给h
 46         
 47     }
 48     return h; 
 49 }
 50  
 51 // 递归遍历 输出 
 52 void Recursion(BinaryNode* root,int D){
 53     
 54     if(root==NULL){
 55         return;
 56     }
 57     
 58     switch(D){
 59         
 60         case 1: // 先序遍历:D L R
 61         
 62             // 先访问根结点 D
 63             printf("%c ",root->ch);
 64             // 再遍历左子树 L。左子树是“树”,有根的子结点,所以递归重头来。
 65             Recursion(root->lchild,1);
 66             // 再遍历右子树 R
 67             Recursion(root->rchild,1); 
 68             break; 
 69             
 70         case 2:    // 中序遍历:L D R
 71             
 72             // 先访问左子数    L     
 73             Recursion(root->lchild,2);    
 74             // 再访问根结点 D
 75             printf("%c ",root->ch);            
 76             // 再访问右子树 R 
 77             Recursion(root->rchild,2);
 78             break;
 79             
 80         case 3:    // 后序遍历:L R D
 81         
 82             // 先访问左子数    L     
 83             Recursion(root->lchild,3);                
 84             // 再访问右子树 R
 85             Recursion(root->rchild,3);
 86             // 再访问根结点 D
 87             printf("%c ",root->ch);
 88             break;
 89         default:
 90             break;             
 91     }
 92 
 93 } 
 94 
 95 
 96 // 手动构建二叉树
 97 void CresteBinaryTree(){
 98     // 共8个结点
 99     BinaryNode nodeA = {'A',NULL,NULL};
100     BinaryNode nodeB = {'B',NULL,NULL};
101     BinaryNode nodeC = {'C',NULL,NULL};
102     BinaryNode nodeD = {'D',NULL,NULL};
103     BinaryNode nodeE = {'E',NULL,NULL};
104     BinaryNode nodeF = {'F',NULL,NULL};
105     BinaryNode nodeG = {'G',NULL,NULL};
106     BinaryNode nodeH = {'H',NULL,NULL};
107     BinaryNode nodeI = {'I',NULL,NULL};
108     BinaryNode nodeJ = {'J',NULL,NULL};
109     // 节点关系
110     nodeA.lchild = &nodeB;
111     nodeA.rchild = &nodeF;
112     nodeB.rchild = &nodeC;
113     nodeC.lchild = &nodeD;
114     nodeC.rchild = &nodeE;
115     nodeF.rchild = &nodeG;
116     nodeG.lchild = &nodeH; 
117     //nodeH.lchild = &nodeI;
118     //nodeI.lchild = &nodeJ;
119     
120     // 先序遍历
121     printf("\n先序遍历:");
122     Recursion(&nodeA,1);
123     
124     // 中序遍历
125     printf("\n中序遍历:");
126     Recursion(&nodeA,2);
127     
128     // 后序遍历
129     printf("\n先序遍历:");
130     Recursion(&nodeA,3);
131     
132     // 计算叶子结点数量
133     CaculateLeafNum(&nodeA);
134     printf("\n叶子结点:%d",num); 
135     
136     // 深度
137     printf("\n树深度为:%d",PostTreeHeight(&nodeA)); 
138 } 
139 
140 
141 
142 int main(){
143     printf("好好学习,天天向上~!!\t\t\t 11 二叉树的递归遍历20220612\n\n\n");
144     
145     
146     CresteBinaryTree();     
147     
148     
149     
150     printf("\n\n");
151     system("pause");
152     
153     return 0;
154 }

 

posted @ 2022-06-12 11:11  油腻老张  阅读(40)  评论(0)    收藏  举报