码迷,mamicode.com
首页 > 其他好文 > 详细

树及遍历

时间:2015-02-20 17:24:46      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:

节点深度:从根到节点的路径长度,d(root)=0

节点高度:从节点到树叶的最长路径的长,h(leaf)=0

树高为根高,树的深度=树的高度

 

树的遍历:

递归的前、中、后序还是蛮简单的:

技术分享
 1 //树的遍历
 2 void preorder_recursive(PtrToBiNode T){   //二叉树递归先序遍历 
 3     if (T){                 //这句不要忘记 
 4         printf("%d ", T->Element);
 5         preorder_recursive(T->left);
 6         preorder_recursive(T->right);
 7     }
 8 }
 9 
10 void inorder_recursive(PtrToBiNode T){   //二叉树递归中序遍历 
11     if (T){
12         inorder_recursive(T->left);
13         printf("%d ", T->Element);
14         inorder_recursive(T->right);
15     }
16 }
17 
18 void lastorder_recursive(PtrToBiNode T){//二叉树递归后序遍历 
19     if (T){
20         lastorder_recursive(T->left);
21         lastorder_recursive(T->right);
22         printf("%d ", T->Element);
23     }
24 }
View Code

非递归就蛮麻烦了

非递归前序和中序直接上代码:

技术分享
 1 void preorder_nonrecursive1(PtrToBiNode T){   //二叉树非递归先序遍历1  左节点一个个入栈,再依次弹出,入右节点
 2     PtrToBiNode stack[MAXSIZE];
 3     PtrToBiNode T1;
 4     int top = -1;
 5     while (T || top != -1){
 6 
 7         while (T){
 8             stack[++top] = T;
 9             printf("%d ", T->Element);
10             T = T->left;
11 
12         }
13         if (top != -1){
14             T = stack[top--];
15             T = T->right;
16 
17 
18         }
19     }
20     
21 }
View Code
技术分享
 1 void inorder_nonrecursive(PtrToBiNode T){   //二叉树非递归中序遍历
 2     PtrToBiNode stack[MAXSIZE];
 3     PtrToBiNode T1;
 4     int top = -1;
 5     while (T || top != -1){
 6 
 7         while (T){
 8             stack[++top] = T;
 9             T = T->left;
10 
11         }
12         if (top != -1){
13             T = stack[top--];
14             printf("%d ", T->Element);
15             T = T->right;
16 
17 
18         }
19     }
20 
21 
22 
23 }
View Code

这两个函数方法是一样的。都用到了。首先根节点先入栈,然后左节点、左节点的左节点啊一直入栈,直到没有左节点可入了。然后出栈,在节点出栈的时候它的左树已经走完了,同时右节点入栈。

非递归后序就比较麻烦了:

技术分享
 1 void lastorder_nonrecursive1(PtrToBiNode T){   //二叉树非递归后序遍历1
 2     BTree stack[MAXSIZE];
 3     int top = -1;
 4     Position P = T;
 5     while (P != NULL || top != -1){
 6         while (P != NULL){
 7             BTree T = (BTree)malloc(sizeof(struct BinTree));
 8             T->isFirst = true;
 9             T->Person = P;
10             stack[++top] = T;
11             P = P->left;
12 
13         }
14         if (top != -1){
15             if (stack[top]->isFirst != true){
16                 printf("%d ", stack[top--]->Person->Element);
17                 P = NULL;
18             }
19             else{
20                 P = stack[top]->Person->right;
21             }
22         }
23     }
24 }
View Code

 

树及遍历

标签:

原文地址:http://www.cnblogs.com/stezqy/p/4296580.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!