二叉树后序遍历(非递归)
二叉树的递归遍历算法就不用说了;在非递归算法中,后序遍历难度大,很多书上只给出思想或者几段无法直接调试的代码,甚至有些书上是错的,当时我在研究的过程中,就是按着书上错误的代码绕了好半天,几预抓狂。好在最终摸索出来了,不禁感叹很多出书人的水平真是...... 这里将直接可以在编译器里调试的代码贴出来(在DEV-C++编译器中编译通过)
这里我们约定:空的节点用空格表示,按照前序遍历来创建树!
1 // main.cpp
2 #include <iostream>
3 using namespace std;
4 typedef struct node {
5 char data;
6 struct node *lchild;
7 struct node *rchild;
8 }BiNode,*BiTree;
9 typedef struct node1{
10 BiTree data[30]; //默认30个元素 ,这里需要一个辅助堆栈!!!
11 int top;
12 }Stack;
13
14 void createTree(BiTree &T) //先序递归创建树,这里注意参数的类型,T的类型是 "*&" ,如果是 "**" 代码稍加改动就OK...
15 {
16 char ch;
17 cin.get(ch).get(); //过滤输入流中每次回车产生的回车符
18 if (ch==' ') T=NULL; //这里首先判断是不是空格,如果是,则为该节点赋NULL
19 else{
20 T=(BiTree)malloc(sizeof(BiNode));
21 T->data=ch;
22 createTree(T->lchild);
23 createTree(T->rchild);
24 }
25 }
26 void initstack(Stack *&st)
27 {
28 st=(Stack *)malloc(sizeof(Stack));
29 st->top=-1;
30 }
31 bool isempty(Stack *st)
32 {
33 return st->top==-1;
34 }
35 bool isfull(Stack *st)
36 {
37 return st->top==19;
38 }
39 void push(Stack *st,BiTree T)
40 {
41 if (!isfull(st))
42 st->data[++st->top]=T; //栈顶指针始终指向堆栈最上面可用的一个元素,因此入栈时候,先要将指针加1,然后再执行入栈操作!
43 else cout<<"已满"<<endl;
44 }
45 BiTree pop(Stack *st)
46 {
47 if (!isempty(st)) return st->data[st->top--];
48 }
49 BiTree gettop(Stack *st)
50 {
51 if (!isempty(st)) return st->data[st->top]; //出栈时,先取出栈顶指针指向的元素,然后再将指针减1,使其指向栈中下一个可用元素!
52 }
53 void preOrderNoRe(BiTree T) // 前序遍历
54 {
55 Stack *st;
56 initstack(st);
57 BiTree p;
58 p=T;
59 while (p!=NULL||!isempty(st))
60 {
61 while (p!=NULL)
62 {
63 cout<<p->data<<" ";
64 push(st,p);
65 p=p->lchild;
66 }
67 if (!isempty(st))
68 {
69 p=pop(st);
70 p=p->rchild;
71 }
72
73 }
74 }
75 void inOrderNoRe(BiTree T) //中序遍历
76 {
77 Stack *st;
78 initstack(st);
79 BiTree p;
80 p=T;
81 while (p!=NULL||!isempty(st))
82 {
83 while (p!=NULL)
84 {
85 push(st,p);
86 p=p->lchild;
87 }
88 if (!isempty(st))
89 {
90 p=pop(st);
91 cout<<p->data<<" ";
92 p=p->rchild;
93 }
94
95 }
96 }
97 void postOrderNoRe(BiTree T) //后序遍历
98 {
99 BiTree p;
100 Stack *st;
101 initstack(st);
102 p=T;
103 int Tag[20]; //栈,用于标识从左(0)或右(1)返回
104 while (p!=NULL || !isempty(st))
105 {
106 while (p!=NULL)
107 {
108 push(st,p);
109 Tag[st->top]=0;
110 p=p->lchild;
111 }
112 while (!isempty(st)&&Tag[st->top]==1)
113 {
114 p=pop(st);
115 cout<<p->data<<" ";
116 }
117 if (!isempty(st))
118 {
119 Tag[st->top]=1; //设置标记右子树已经访问
120 p=gettop(st);
121 p=p->rchild;
122 }
123 else break;
124 }
125 }
126 int main()
127 {
128 cout<<"Enter char one by one hicjiajia"<<endl;
129 BiNode *T;
130 createTree(T);
131 cout<<endl;
132
133 cout<<"preOrderNoRe: ";preOrderNoRe(T);cout<<endl;
134 cout<<"inOrderNoRe: ";inOrderNoRe(T);cout<<endl;
135 cout<<"postOrderNoRe: ";postOrderNoRe(T);cout<<endl;
136 system("pause");
137 return 0;
138 }
3 using namespace std;
4 typedef struct node {
5 char data;
6 struct node *lchild;
7 struct node *rchild;
8 }BiNode,*BiTree;
9 typedef struct node1{
10 BiTree data[30]; //默认30个元素 ,这里需要一个辅助堆栈!!!
11 int top;
12 }Stack;
13
14 void createTree(BiTree &T) //先序递归创建树,这里注意参数的类型,T的类型是 "*&" ,如果是 "**" 代码稍加改动就OK...
15 {
16 char ch;
17 cin.get(ch).get(); //过滤输入流中每次回车产生的回车符
18 if (ch==' ') T=NULL; //这里首先判断是不是空格,如果是,则为该节点赋NULL
19 else{
20 T=(BiTree)malloc(sizeof(BiNode));
21 T->data=ch;
22 createTree(T->lchild);
23 createTree(T->rchild);
24 }
25 }
26 void initstack(Stack *&st)
27 {
28 st=(Stack *)malloc(sizeof(Stack));
29 st->top=-1;
30 }
31 bool isempty(Stack *st)
32 {
33 return st->top==-1;
34 }
35 bool isfull(Stack *st)
36 {
37 return st->top==19;
38 }
39 void push(Stack *st,BiTree T)
40 {
41 if (!isfull(st))
42 st->data[++st->top]=T; //栈顶指针始终指向堆栈最上面可用的一个元素,因此入栈时候,先要将指针加1,然后再执行入栈操作!
43 else cout<<"已满"<<endl;
44 }
45 BiTree pop(Stack *st)
46 {
47 if (!isempty(st)) return st->data[st->top--];
48 }
49 BiTree gettop(Stack *st)
50 {
51 if (!isempty(st)) return st->data[st->top]; //出栈时,先取出栈顶指针指向的元素,然后再将指针减1,使其指向栈中下一个可用元素!
52 }
53 void preOrderNoRe(BiTree T) // 前序遍历
54 {
55 Stack *st;
56 initstack(st);
57 BiTree p;
58 p=T;
59 while (p!=NULL||!isempty(st))
60 {
61 while (p!=NULL)
62 {
63 cout<<p->data<<" ";
64 push(st,p);
65 p=p->lchild;
66 }
67 if (!isempty(st))
68 {
69 p=pop(st);
70 p=p->rchild;
71 }
72
73 }
74 }
75 void inOrderNoRe(BiTree T) //中序遍历
76 {
77 Stack *st;
78 initstack(st);
79 BiTree p;
80 p=T;
81 while (p!=NULL||!isempty(st))
82 {
83 while (p!=NULL)
84 {
85 push(st,p);
86 p=p->lchild;
87 }
88 if (!isempty(st))
89 {
90 p=pop(st);
91 cout<<p->data<<" ";
92 p=p->rchild;
93 }
94
95 }
96 }
97 void postOrderNoRe(BiTree T) //后序遍历
98 {
99 BiTree p;
100 Stack *st;
101 initstack(st);
102 p=T;
103 int Tag[20]; //栈,用于标识从左(0)或右(1)返回
104 while (p!=NULL || !isempty(st))
105 {
106 while (p!=NULL)
107 {
108 push(st,p);
109 Tag[st->top]=0;
110 p=p->lchild;
111 }
112 while (!isempty(st)&&Tag[st->top]==1)
113 {
114 p=pop(st);
115 cout<<p->data<<" ";
116 }
117 if (!isempty(st))
118 {
119 Tag[st->top]=1; //设置标记右子树已经访问
120 p=gettop(st);
121 p=p->rchild;
122 }
123 else break;
124 }
125 }
126 int main()
127 {
128 cout<<"Enter char one by one hicjiajia"<<endl;
129 BiNode *T;
130 createTree(T);
131 cout<<endl;
132
133 cout<<"preOrderNoRe: ";preOrderNoRe(T);cout<<endl;
134 cout<<"inOrderNoRe: ";inOrderNoRe(T);cout<<endl;
135 cout<<"postOrderNoRe: ";postOrderNoRe(T);cout<<endl;
136 system("pause");
137 return 0;
138 }
运行结果如图:
posted on 2010-08-27 13:32 hicjiajia 阅读(35866) 评论(3) 编辑 收藏 举报