一
对于一个节点p,沿着左子树一直向下,直到没有左孩子,在此过程中标记节点为第一次访问,
现在栈顶第一次访问该节点,由于右子树没有访问完,按照刚才的方式访问右子树。
访问完右子树后,第二次访问该节点,现在将其出栈并访问。
二
设置一个节点栈,一个标记栈,两个栈是同步的,标记栈标记第几次访问。
三
struct BTNode
{
int d;
struct BTNode* lchild;
struct BTNode* rchild;
};
struct BTnode *stack[100];
int flag[100] = {0};
int top = 0;
void postOrder(struct BTNode *root)
{
top = 0;
struct BTNode *p = root;
while (p || top > 0)
{
while(p)
{
stack[top] = p;
flag[top] = 1;
top++;
p = p->lchild;
}
if (top > 0)
{
struct BTNode* tmp = stack[top-1];
if (flag[top-1] == 1)
{
flag[top-1] = 2;
p = tmp->rchild;
}
else if (flag[top-1] == 2)
{
printf("%d\n", tmp->d);
top--;
p = NULL;
}
}
}
}
本文详细介绍了如何使用递归方法实现二叉树的深度优先搜索算法,包括先序、中序和后序遍历。通过栈和标记数组辅助,确保每个节点被恰当地访问多次,并在遍历完成后正确地弹出栈。
4412

被折叠的 条评论
为什么被折叠?



