树的常用遍历

先定义树的结构体:

1 typedef struct BTNode{
2     int data;
3     struct BtNode *lchild;
4     struct BTNode *rchild;
5 }BTNode;
View Code

树的递归调用的遍历:

1 void Traveorder(BTNode *p){    //1,2,3代表先序,中序,后序
2     if(p!=NULL){
3         //(1)visit(p)
4         preorder(p->lchild);
5         //(2)
6         preorder(p->rchild);
7         //(3)
8     }
9 }

树的非递归遍历:

树的遍历要先右子树进栈才能保证左子树先出栈,以便于左子树先遍历。

 1 //先序遍历
 2 void PreorderNorecursion(BTNode *bt){
 3     if(bt!=NULL){
 4         BTNode *stack[maxsize];//定义栈
 5         int top=-1;//栈顶
 6         BTNode *p=NULL;
 7         stack[++top]=bt;
 8         while(top!=NULL){
 9             p=stack[top--];
10             visit(p);
11             if(p->rchild!=NULL)
12                 stack[++top]=p->rchild;
13             if(p->lchild!=NULL)
14                 stack[++top]=p->lchild;
15         }
16     }
17 }
18 //后序遍历
19 void postorderNorecursion(BTNode *bt){
20     if(bt!=NULL){
21         BTNode *stack1[maxsize];
22         int top1=-1;
23         BTNode *stack2[maxsize];
24         int top2=-1;
25         BTNode *p=NULL;
26         stack[++top1]=bt;
27         while(top1!=-1){
28             p=stack1[top1--];
29             stack2[++top2]=p;
30             if(p->lchild!=NULL)
31                 stack1[++top]=p->lchild;
32             if(p->rchild!=NULL)
33                 stack1[++top]=p->rchild;
34         }
35         while(top2!=-1){
36             p=stack[top--];
37             visit(p);
38         }
39 }
40 //中序遍历
41 void inorderNorecursion(BTNode *bt){
42     if(bt!=NULL){
43     BTNode *stack[maxsize];
44     int top=-1;    
45     BTNode *p;
46     p=bt;
47     while(top!=-1||p!=NULL){
48         whlie(p!=NULL){
49             stack[++top]=p;
50             p=p->lchild;
51         }
52         if(top!=-1){
53             p=stack[top--];
54             visit(p);
55             p=p->rchild;
56         }
57     }
58     }
59 }

C++中的visit函数可以这样写:

1 void visit(BTNode *p){
2     cout<<p->data<<endl;
3 }
View Code

 

posted @ 2019-08-04 00:01  weigm*  阅读(119)  评论(0)    收藏  举报