非递归实现二叉树的先序遍历,中序遍历,后序遍历
1. 二叉树先序遍历(非递归)
先序的遍历的访问顺序为先根节点,再左孩子,最后右孩子。
所以,根据栈后进先出的特点,应先入栈右孩子,再入栈左孩子。
先序遍历,借助栈实现
1根节点入栈
2判断栈顶元素是否为空
3访问栈顶元素,出栈
4栈顶元素的右孩子若不为空,入栈。栈顶元素的左孩子不为空,入栈。
5循环2-4
9 void TreePreLoop(TreeNode* root)
10 {
11 if(root==NULL)
12 {
13 return ;
14 }
15 //定义一个栈
16 SeqStack stack;
17 //栈的初始化
18 SeqStackInit;
19 //定义栈顶元素类型
20 SeqStackType top;
21 //根节点入栈
22 SeqStcakPush(&stack,root);
23 while(1)
24 {
25 int ret=SeqStackTop(&stack,&top);
26 if(ret==-1)
27 {
28 return ;
29 }
30 printf("%c",top->data);
31 SeqStackPop(&stack);
32 if(top->rchild!=NULL)
33 {
34 //入栈
35 SeqStackPush(&stack,top->rchild);
36 }
37 if(top->lchild!=NULL)
38 {
39 //入栈
40 SeqStcakPush(&stack,top->lchild);
41 }
42 }
43 return ;
44 }
2二叉树中序遍历(非递归)
借用栈实现
定义指针变量cur指向root
1当cur不为空时,入栈,cur指向左孩子,循环直到cur左孩子为空
2取栈顶元素如果为空则遍历完成
3如果栈顶元素不为空,访问栈顶元素,出栈,
4cur指向栈顶元素的右孩子
5循环1-4
58 void TreeInOrder(TreeNode* root)
59 {
60 if(root==NULL)
61 {
62 return ;
63 }
64
65 //定义一个栈
66 SeqStack stack;
67 //对栈进行初始化
68 SeqStackInit;
69 //定义指针变量指向根节点
70 TreeNode* cur=root;
71 while(1)
72 {
73 //当根节点不为空
74 while(cur!=NULL)
75 {
76 //入栈根节点
77 SeqStackPush(&stack,cur);
78 //cur指向跟栈顶元素的左孩子
79 cur=cur->lchild;
80 }
81 //判断栈顶元素是否为空
82 int ret=SeqStackTop(&stack,&cur);
83 if(ret==-1)
84 {
85 //如果为空说明遍历结束
86 return ;
87 }
88 //如果不为空访问栈顶元素,并出栈
89 printf("%c",cur->data);
90 SeqStackPop(&stack);
91 //cur指向栈顶元素的右孩子
92 cur=cur-rchild;
93 }
94 return ;
95 }
3. 二叉树后序遍历(非递归)
借用栈实现
设置当前节点指针cur,初始为根节点的指针,定义一个存储上一个访问结点的指针pre,初始为NULL,
1当cur不为空,入栈,cur指向左孩子,循环直到cur为空
2取栈顶元素如果为空则遍历结束
3如果cur的右孩子为空或者右孩子与上一次节点相同
则访问栈顶元素,出栈,将pre置为top
4cur指向栈顶元素的右孩子
5循环2-4
109 void TreeLater(TreeNode* root)
110 {
111 if(root==NULL)
112 {
113 return ;
114 }
115
116 //定义一个栈
117 SeqStack stack;
118 //栈的初始化
119 SeqStcakInit;
120 //定义指针变量cur指向root
121 TreeNode* cur=root;
122 //指针pre为存储上一次访问的节点
123 TreeNode* pre=NULL;
124
125 while(1)
126 {
127 while(cur!=NULL)
128 {
129 //入栈cur
130 SeqStackPush(&stack,cur);
131 //cur指向左孩子
132 cur=cur->lchild;
133 }
134 TreeNode* top=NULL;
135 //取栈顶元素
136 int ret=SeqStackTop(&stack,&top);
137 if(ret==-1)
138 {
139 //如果栈顶元素为空,则遍历结束
140 return ;
141 }
142 //栈顶元素不为空,判断右孩子是为空
143 //或者右孩子是否与上一次节点相同
144 if(top->rchild==NULL||top->rchild==pre)
145 {
146 //访问栈顶元素
147 printf("%c",top->data);
148 //栈顶元素保存到pre里
149 pre=top;
150 //出栈
151 SeqStackPop(&stack);
152 }
153 else
154 {
155 //cur指向栈顶元素的右孩子
156 cur=top->rchild;
157 }
158 }
159 return ;
160 }