二叉树后序遍历 递归 非递归

后序遍历的操作如下:
1)后序遍历左子树;
2)后序遍历右子树;
3)访问根节点;


对应的递归算法如下:

void PostOrder(Bitree T) {
    if (T != NULL) {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        visit(T);
     }
}

非递归算法算法思想:当用堆栈来存储结点时,必须分清返回根结点时是从左子树返回的
还是从右子树返回的。所以,使用辅助指针r,指向其最近访问过的结点。也可在结点
增加一个标志域,记录是否已被访问。
对应的非递归算法如下:

void PostOrder(Bitree T) {
    InitStack(S);
    p = T;
    r = NULL;
    while (p || !IsEmpty(S)) {
        if (p) {
            push(S, p);
            p = p->lchild;
        }
        else {
            Get(S, p);
            if (p->rchild&&p->rchild != r) {
                p = p->rchild;
                push(S, p);
                p = p->lchild;
            }
            else {
                pop(S, p);
                visit(p->data);
                r = p;
                p = NULL;
            }
        }
    }
}

猜你喜欢

转载自www.cnblogs.com/brainstorm-yc/p/11774288.html