本文参考:http://www.slyar.com/blog/bitree-unrecursion-c.html
为了加深记忆,将代码中的每一步操作弄成了PPT。图解如下,如有不当之处,还请指正。谢谢。
前序遍历:先访问根节点,再访问左子树,最后访问右子树。
设置一个栈,出栈即为访问节点。
先将根节点进栈,在栈不空时一直如下循环:出栈,访问,将其右孩子进栈,再将左孩子进栈。
代码如下:
void PreOrderTraverse(BTNode *T, void (* visit)(ElementType e))
{
BTNode *stack[MAX_SIZE], *p;
int top = -1;
if(T != NULL) {
stack[++top] = T;
while(top > -1)
{
p = stack[top--];
visit(p->data);
if(p->rchild != NULL)
{
stack[++top] = p->rchild;
}
if(p->lchild != NULL)
{
stack[++top] = p->lchild;
}
}
}
}
代码运行步骤:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.