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 }
本文来自博客园,作者:油腻老张,转载请注明原文链接:https://www.cnblogs.com/stou/p/16367593.html
浙公网安备 33010602011771号