一
对于一个节点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;
}
}
}
}