二叉树的遍历:
(递归算法)

1.先序遍历(根左右)
void PreOrder(BiTree T) {
    if (T != NULL) {
        visit(T);
        PreOrder(T->lchild);
        PreOrder(T->rchild);
    }
}
2.中序遍历(左根右)
void InOrder(BiTree T) {
    if (T != NULL) {
        InOrder(T->lchild);
        visit(T);
        InOrder(T->rchild);
    }
}
3.后序遍历(左右根)
void PostOrder(BiTree T) {
    if (T != NULL) {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        visit(T);
    }

(非递归算法)

1.先序遍历(根左右)
void PreOrder(BiTreeNode T) {
    initStack(stack);
    if (T != NULL) {
        push(stack, T);
    }
    while (!isEmpty(stack)) {
        BiTreeNode *node = pop(stack);
        visit(node);
        if (node->rchild != NULL) {
            push(&stack, node->rchild);
        }
        if (node->lchild != NULL) {
            push(stack, node->lchild);
        }
    }
}
2.中序遍历(左根右)
void InOrder(BiTreeNode T) {
    initStack(stack);
    BiTreeNode *current = T;
    while (current != NULL || !isEmpty(stack)) {
        while (current != NULL) {
            push(stack, current);
            current = current->lchild;
        }
        current = pop(stack);
        visit(current);
        current = current->rchild;
    }
}
3.后序遍历(左右根)
void PostOrderNonRecursive(BiTreeNode T) {
    initStack(stack1);
    initStack(stack2);
    if (T != NULL) {
        push(stack1, T);
    }
    while (!isEmpty(stack1)) {
        BiTreeNode *node = pop(stack1);
        push(stack2, node);
        if (node->lchild != NULL) {
            push(stack1, node->lchild);
        }
        if (node->rchild != NULL) {
            push(stack1, node->rchild);
        }
    }
    while (!isEmpty(stack2)) {
        BiTreeNode *node = pop(stack2);
        visit(node);
    }
}
posted on 2024-12-09 09:43  蒸饺  阅读(16)  评论(0)    收藏  举报