2021 - 10 -7 ! 二叉树的前序、中序、后序遍历 非递归思路(迭代版本)

这篇博客详细介绍了如何使用栈非递归地实现二叉树的前序、中序和后序遍历。前序遍历通过先右后左的入栈顺序模拟递归;中序遍历利用左子树完全入栈并出栈后再处理右子树;后序遍历则通过对前序遍历的顺序调整和字符串反转来实现。这些方法需要对二叉树结构有深入理解,并建议通过画图辅助理解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前序遍历非递归过程
中序希望我的脖子还在

//! 前序遍历的非递归版本,精髓在于用栈模拟递归的过程,但实际进栈出栈顺序与递归并不一样,
//! 比较抽象,建议画图理解,比较重要
void BinarySearchTreesZH::preorderTraversalNoRecursion(Node *node)
{
    stack<Node *> stk;
    if (node == nullptr)
    {
        return;
    }
    stk.push(node);
    while (stk.size() != 0)
    {
        Node *top = stk.top();
        cout << stk.top()->element << " ";
        stk.pop();
        //! 注意前序遍历是中左右,出栈顺序是先左后右,进栈就要先右后左
        if (top->right != nullptr)
        {
            stk.push(top->right);
        }
        if (top->left != nullptr)
        {
            stk.push(top->left);
        }
    }
}

//! 中序遍历,非递归版,跟上一个前序遍历的非递归版比,思路相同,但是实现方法和过程完全不同
//! 比较抽象,依然建议画图理解
//! 巧妙地改变了入栈顺序实现了中序遍历
void BinarySearchTreesZH::inorderTraversalNoRecursion(Node *node)
{
    if (node == nullptr)
    {
        return;
    }
    stack<Node *> stk;
    stk.push(node);
    while (stk.size() != 0)
    {
        while (node->left != nullptr)
        {
            stk.push(node->left);
            node = node->left;
        }
        //! 整体思路为遇到根节点,就遍历左子树的所有左节点,并全部入栈,然后挨个出栈,
        //! 出栈中检测是否有右节点,如果有则以右节点为根结点,再次遍历全部左结点,全部入栈,然后挨个出栈
        Node *top = stk.top();
        cout << top->element << " ";
        stk.pop();
        if (top->right != nullptr)
        {
            node = top->right;
            stk.push(top->right);
        }
    }
}

//! 后序遍历,非递归版,可以通过改变前序遍历非递归版中左右结点的入栈顺序,和翻转数组的想法实现
void BinarySearchTreesZH::postorderTraversalNoRecursion(Node *node)
{
    if (node == nullptr)
    {
        return;
    }
    string s = " ";
    stack<Node *> stk;
    stk.push(node);
    Node *top = stk.top();
    while (stk.size() != 0)
    {
        top = stk.top();
        stk.pop();
        s = s + to_string(top->element) + " ";
        if (top->left != nullptr)
        { //! 整体思路和前序遍历相同,入栈顺序自己想想前序中左右,和后序左右中,就明白了
            stk.push(top->left);
        }
        if (top->right != nullptr)
        {
            stk.push(top->right);
        }
    }
    reverse(s.begin(), s.end()); //reverse函数反转字符串
    cout << s;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值