二叉树的三种非递归遍历

ericf / 2024-10-23 / 原文

// 先序遍历(非递归)
void PreOrder(BiTree T) {
    LinkStack S;
    InitStack(S);
    BiTree p = T;
    while(p || !IsEmpty(S)) {
        if(p) {
            visit(p);
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            p = p->rchild;
        }
    }
}
// 中序遍历(非递归)
void InOrder(BiTree T) {
    LinkStack S;
    InitStack(S);
    BiTree p = T;
    while(p || !IsEmpty(S)) {
        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            Pop(S, p);
            visit(p);
            p = p->rchild;
        }
    }
}
// 后序遍历(非递归)
void PostOrder(BiTree T) {
    LinkStack S;
    InitStack(S);
    BiTree p = T;
    BiTree r = NULL;
    while(p || !IsEmpty(S)) {
        if(p) {
            Push(S, p);
            p = p->lchild;
        } else {
            GetTop(S, p);
            if(p->rchild && p->rchild != r) {
                p = p->rchild;
            } else {
                Pop(S, p);
                visit(p);
                r = p;
                p = NULL;
            }
        }
    }
}