首页 > 代码库 > 二叉树
二叉树
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <math.h> 4 #include <stack> 5 #include <queue> 6 7 using namespace std; 8 9 typedef int ItemType; 10 typedef struct Node{ 11 ItemType data; 12 struct Node *lchild, *rchild; 13 }Node, *PNode; 14 //递归创建添加新节点 15 void insertNode(PNode *root, ItemType data) 16 { 17 if(*root == NULL) 18 { 19 *root = (PNode)malloc(sizeof(Node)); 20 (*root)->data =http://www.mamicode.com/ data; 21 (*root)->lchild = (*root)->rchild = NULL; 22 } 23 else 24 { 25 if(data < (*root)->data) 26 insertNode(&(*root)->lchild, data); 27 else 28 insertNode(&(*root)->rchild, data); 29 } 30 } 31 //递归前序遍历 32 void preOrder(PNode root) 33 { 34 if(root == NULL) 35 return; 36 printf("%d ", root->data); 37 preOrder(root->lchild); 38 preOrder(root->rchild); 39 } 40 //递归中序遍历 41 void inOrder(PNode root) 42 { 43 if(root == NULL) 44 return; 45 inOrder(root->lchild); 46 printf("%d ", root->data); 47 inOrder(root->rchild); 48 } 49 //递归后续遍历 50 void postOrder(PNode root) 51 { 52 if(root == NULL) 53 return; 54 postOrder(root->lchild); 55 postOrder(root->rchild); 56 printf("%d ", root->data); 57 } 58 //非递归前序遍历 59 void preOrder_NonRecursion(PNode root) 60 { 61 stack<PNode> s; 62 PNode p = root; 63 while(p != NULL || !s.empty()) 64 { 65 if(p != NULL) 66 { 67 printf("%d ", p->data); 68 s.push(p); 69 p = p->lchild; 70 } 71 else 72 { 73 p = s.top(); 74 s.pop(); 75 p = p->rchild; 76 } 77 } 78 } 79 //非递归中序遍历 80 void inOrder_NonRecursion(PNode root) 81 { 82 stack<PNode> s; 83 PNode p = root; 84 while(p != NULL || !s.empty()) 85 { 86 if(p != NULL) 87 { 88 s.push(p); 89 p = p->lchild; 90 } 91 else 92 { 93 p = s.top(); 94 printf("%d ", p->data); 95 s.pop(); 96 p = p->rchild; 97 } 98 } 99 }100 //非递归后续遍历101 void postOrder_NonRecursion(PNode root)102 {103 stack<pair<PNode, bool> > s;104 PNode p = root;105 while(p != NULL || !s.empty())106 {107 if(p != NULL)108 {109 s.push(make_pair(p, false));110 p = p->lchild;111 }112 else113 {114 if(s.top().second == false)115 {116 s.top().second = true;117 p = s.top().first->rchild;118 }119 else120 {121 printf("%d ", s.top().first->data);122 s.pop();123 }124 }125 }126 }127 //层级遍历128 void levelOrder(PNode root)129 {130 queue<PNode> q;131 PNode p = root;132 if(p != NULL)133 q.push(p);134 while(!q.empty())135 {136 p = q.front();137 printf("%d ", p->data);138 if(p->lchild != NULL)139 q.push(p->lchild);140 if(p->rchild != NULL)141 q.push(p->rchild);142 q.pop();143 }144 }145 //求一层的所有节点146 void specifyLevelNode(PNode root, int h)//h是指定的高度147 {148 if(root == NULL)149 return;150 queue<PNode> q;151 PNode p = root;152 q.push(p);153 int last_level_number = 1;//用来标记以上所有层多少个154 int visit_number = 0;155 int in_queue_number = 1;//入队的多少个156 int height = 0;157 while (!q.empty())158 {159 visit_number++;160 p = q.front();161 q.pop();162 163 if (p->lchild != NULL)164 {165 q.push(p->lchild);166 in_queue_number++;167 if (h - 2 == height)/*因为这个高度执行到后面才++, 所以h要减一,168 还有就是当前是p->lchild而不是p,所以在减一*/169 printf("%d ", p->lchild->data);170 }171 if(p->rchild != NULL)172 {173 q.push(p->rchild);174 in_queue_number++;175 if (h - 2== height)//同上176 printf("%d ", p->rchild->data);177 }178 179 if(visit_number == last_level_number)180 {181 height++;182 last_level_number = in_queue_number;183 }184 }185 }186 //递归求树的深度187 int getDepth(PNode root)188 {189 int d1, d2;190 if(root == NULL)191 return 0;192 d1 = getDepth(root->lchild);193 d2 = getDepth(root->rchild);194 return (d1 > d2 ? d1 : d2) + 1;195 }196 //非递归求数的深度197 int getDepth_NonRecursion(PNode root)198 {199 if(root == NULL)200 return 0;201 queue<PNode> q;202 PNode p = root;203 q.push(p);204 int last_level_number = 1;//用来标记以上所有层多少个205 int visit_number = 0;206 int in_queue_number = 1;//入队的多少个207 int height = 0;208 while (!q.empty())209 {210 visit_number++;211 p = q.front();212 q.pop();213 214 if (p->lchild != NULL)215 {216 q.push(p->lchild);217 in_queue_number++;218 }219 if(p->rchild != NULL)220 {221 q.push(p->rchild);222 in_queue_number++;223 }224 225 if(visit_number == last_level_number)226 {227 height++;228 last_level_number = in_queue_number;229 }230 }231 return height;232 }233 //求二叉树中相距最远的两个节点之间的距离234 int getMaxDistance(PNode root)235 {236 if(root == NULL)237 return 0;238 return getDepth(root->lchild) + getDepth(root->rchild);239 }240 //求两节点的最近的共同祖先241 void getCommonAncestor(PNode root, ItemType n1, ItemType n2)242 {243 if(root == NULL)244 return;245 while((n1 < root->data && n2 < root->data) || (n1 > root->data && n2 > root->data) )246 {247 if(n1 < root->data)248 root = root->lchild;249 else250 root = root->rchild;251 }252 printf("latest common ancestor: %d\n", root->data);253 }254 255 //求路径和为指定值的所有路径256 257 int main()258 {259 int n;260 scanf("%d", &n);261 int t;262 PNode root = NULL;263 for(int i = 0; i < n; i++)264 {265 scanf("%d", &t);266 insertNode(&root, t);267 }268 printf("Previous Order Traverse:\n");269 preOrder(root);270 printf("\nIn Order Traverse:\n");271 inOrder(root);272 printf("\nPost Order Traverse:\n");273 postOrder(root);274 printf("\nNon-Recursion Previous Order Traverse:\n");275 preOrder_NonRecursion(root);276 printf("\nNon-Recursion In Order Traverse:\n");277 inOrder_NonRecursion(root);278 printf("\nNon-Recursion Post Order Traverse:\n");279 postOrder_NonRecursion(root);280 printf("\nLevel Order Traverse:\n");281 levelOrder(root);282 printf("\nThe depth of tree: %d\n", getDepth(root));283 printf("The depth of tree(Non-Recursion): %d\n", getDepth_NonRecursion(root));284 specifyLevelNode(root, 3);//求第三层的所有节点285 printf("\nThe max distance: %d\n", getMaxDistance(root));286 getCommonAncestor(root, 7, 4);//测试数据,得出7和4的最近祖先287 288 return 0;289 }
二叉树
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。