首页 > 代码库 > 树 - 二叉树
树 - 二叉树
读了Robert Sedgewick的《算法:C语言实现》(第三版)的第五章,了解了许多关于树,特别是二叉树的知识。这里总结一下。直接看代码(C++)吧。
1 #include <cstdio> 2 #include <cstdlib> 3 #include <queue> 4 #include <stack> 5 6 #define null 0 7 #define NEXTLINE printf("\n") 8 #define MAX(x, y) ((x)>(y)?(x):(y)) 9 10 int max = 1<<31; 11 int min = ~(1<<31); 12 13 typedef int Item; 14 typedef struct node *link; 15 struct node { 16 Item item; 17 link l, r; 18 }; 19 // 初始化树 20 link 21 InitTree(Item item) 22 { 23 link t = (link)malloc(sizeof *t); 24 if (t == null) { 25 return null; 26 } 27 t->item = item; 28 t->l = null; 29 t->r = null; 30 return t; 31 } 32 // 加入左子节点 33 link 34 AddLeftNode(link t, Item item) 35 { 36 if (t == null) { 37 return null; 38 } 39 link newNode = (link)malloc(sizeof *newNode); 40 if (newNode == null) { 41 return null; 42 } 43 t->l = newNode; 44 newNode->item = item; 45 newNode->l = null; 46 newNode->r = null; 47 return newNode; 48 } 49 // 加入右子节点 50 link 51 AddRightNode(link t, Item item) 52 { 53 if (t == null) { 54 return null; 55 } 56 link newNode = (link)malloc(sizeof *newNode); 57 if (newNode == null) { 58 return null; 59 } 60 t->r = newNode; 61 newNode->item = item; 62 newNode->l = null; 63 newNode->r = null; 64 return newNode; 65 } 66 // 打印节点中的内容 67 void 68 PrintItem(link t) 69 { 70 printf("%d\t", t->item); 71 } 72 // 前序遍历(递归) 73 void 74 PreTraverse(link t) 75 { 76 if (t == null) { 77 return; 78 } 79 PrintItem(t); 80 PreTraverse(t->l); 81 PreTraverse(t->r); 82 } 83 // 中序遍历(递归) 84 void 85 InTraverse(link t) 86 { 87 if (t == null) { 88 return; 89 } 90 InTraverse(t->l); 91 PrintItem(t); 92 InTraverse(t->r); 93 } 94 // 后序遍历(递归) 95 void 96 PostTraverse(link t) 97 { 98 if (t == null) { 99 return;100 }101 PostTraverse(t->l);102 PostTraverse(t->r);103 PrintItem(t);104 }105 // 层次遍历(非递归) 106 void107 LevelTraverse(link t)108 {109 if (t == null) {110 return;111 }112 std::queue<link> linkQueue;113 linkQueue.push(t);114 while (!linkQueue.empty()) {115 PrintItem(t = linkQueue.front());116 linkQueue.pop();117 if (t->l != null) linkQueue.push(t->l);118 if (t->r != null) linkQueue.push(t->r);119 }120 }121 // 前序遍历(非递归) 122 void123 PreTraverseNR(link t)124 {125 if (t == null) {126 return;127 }128 std::stack<link> linkStack;129 linkStack.push(t);130 while (!linkStack.empty()) {131 PrintItem(t = linkStack.top());132 linkStack.pop();133 if (t->r != null) linkStack.push(t->r);134 if (t->l != null) linkStack.push(t->l);135 }136 }137 // 找最大节点 138 void139 FindMax(link t)140 {141 if (t == null) {142 return;143 }144 if (max < t->item) {145 max = t->item;146 }147 FindMax(t->l);148 FindMax(t->r);149 }150 // 找最小节点 151 void152 FindMin(link t)153 {154 if (t == null) {155 return;156 }157 if (min > t->item) {158 min = t->item;159 }160 FindMin(t->l);161 FindMin(t->r);162 }163 // 计算深度(从0开始计算) 164 int165 CountDepth(link t)166 {167 if (t == null) {168 return -1;169 }170 return MAX(CountDepth(t->l), CountDepth(t->r)) + 1;171 }172 // 计算所有节点数目 173 int174 CountNodes(link t)175 {176 if (t == null) {177 return 0;178 }179 return CountNodes(t->l) + CountNodes(t->r) + 1;180 }181 // 计算叶子节点数目 182 int183 CountLeaves(link t)184 {185 if (t == null) {186 return 0;187 }188 if (!CountLeaves(t->l) && !CountLeaves(t->r)) {189 return 1;190 }191 return CountLeaves(t->l) + CountLeaves(t->r);192 }193 // 清空一棵树 194 void195 DeleteTree(link t)196 {197 if (t == null) {198 return;199 }200 if (!(t->l) && !(t->r)) {201 free(t);202 return;203 }204 DeleteTree(t->l);205 DeleteTree(t->r);206 free(t);207 }208 209 int210 main(int argc, char** argv)211 {212 link t, t1, t2, t3, t4;213 t = InitTree(1);214 t1 = AddLeftNode(t, 2);215 t2 = AddRightNode(t, 3);216 t3 = AddLeftNode(t1, 4);217 t4 = AddRightNode(t1, 5);218 219 220 PreTraverse(t);221 NEXTLINE;222 InTraverse(t);223 NEXTLINE;224 PostTraverse(t);225 NEXTLINE;226 LevelTraverse(t);227 NEXTLINE;228 PreTraverseNR(t);229 NEXTLINE;230 231 FindMax(t);232 FindMin(t);233 printf("Maxima Item in tree: %d\n", max);234 printf("Minima Item in tree: %d\n", min);235 236 printf("Depth of the tree(start from 0): %d\n", CountDepth(t));237 238 printf("Number of the nodes of the tree: %d\n", CountNodes(t));239 240 printf("Number of the leaves of the tree: %d\n", CountLeaves(t));241 242 243 DeleteTree(t);244 245 system("pause");246 return 0;247 }
树 - 二叉树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。