C++二叉树的前序中序后序非递归实现方法详细讲解

 更新时间:2023年03月08日 11:23:25   作者:平凡的人1  
前序遍历的顺序是根、左、右。任何一颗树都可以认为分为左路节点,左路节点的右子树。先访问左路节点,再来访问左路节点的右子树。把访问左路节点的右子树看成一个子问题,就可以完整递归访问了

二叉树的前序遍历

前序遍历的顺序是根、左、右。任何一颗树都可以认为分为左路节点,左路节点的右子树。先访问左路节点,再来访问左路节点的右子树。把访问左路节点的右子树看成一个子问题,就可以完整递归访问了。

先定义栈st存放节点、v存放值,TreeNode* cur,cur初始化为root。

当cur不为空或者栈不为空的时候(一开始栈是空的,cur不为空),循环继续:先把左路节点存放进栈中,同时把值存入v中,一直循环,直到此时的左路节点为空,访问结束。在弹出栈顶元素top,把top->right赋值给我们的cur,就可以转化成子问题去访问左路节点的右子树了。

  • 栈st不为空说明此时还有左路节点的右子树还没访问,cur不为空说明此时还有树要去访问。当两个同时为空时,循环结束,最终得到前序遍历。
  • 一个节点出栈说明这个节点及其左子树已经访问完了,因为我们是先把左路节点存入栈中,此时还剩右子树没有访问。
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> st;
        TreeNode*cur = root;
        while(!st.empty()||cur)
        {
            //左路节点
            while(cur)
            {
                st.push(cur);
                v.push_back(cur->val);
                cur = cur->left;
            }
            //左路节点右子树
            TreeNode* top = st.top();
            st.pop();
            cur = top->right;//转化成子问题访问右子树
        }
        return v;
    }
};

二叉树的中序遍历

中序遍历是左、根、右。左子树访问完之后才能去访问根。左路节点一直走直到左子树访问完,入栈的过程中不去进行访问(存放数值到v中),当左路节点出栈之后,也就是从栈中弹出进行访问。

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> st;
        TreeNode*cur = root;
        while(cur||!st.empty())
        {
            while(cur)
            {
                //不访问
                st.push(cur);
                cur = cur->left;
            }
            TreeNode*top = st.top();
            //进行访问
            v.push_back(top->val);
            st.pop();
            cur = top->right;
        }
        return v;
    }
};

二叉树的后序遍历

后序的遍历顺序是左、右、根。与前面的相比,比较麻烦,我们需要把左子树和右子树访问完再去访问根。我们定义一个栈,在栈里面取到一个节点时:右子树是否访问过,如果没有访问,迭代子问题访问,如果访问过了,则访问这个根节点,pop出栈

如果top的右子树为空或者右子树已经访问过了(上一个访问节点是右子树的根),那么说明右子树不用访问或者访问过了,可以访问根top;当右子树不为空,且没有访问过,则迭代子问题访问。

通过prev来判断上一次访问的节点:如果prev等于top->right时,表示栈顶节点的右子树已经访问过了,可以弹出栈顶节点并访问它。

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> v;
        stack<TreeNode*> st;
        TreeNode*cur = root;
        TreeNode*prev = nullptr;
        while(cur||!st.empty())
        {
            while(cur)
            {
                st.push(cur);
                cur = cur->left;
            }
            TreeNode*top = st.top();
            //top的右子树为空,或者右子树已经访问过了(上一个访问节点时右子树的根)那么说明右子树不用访问或者访问过了,可以访问根top
            //右子树不为空,且没有访问, 则迭代子问题访问
            if(top->right==nullptr||top->right==prev)
            {
                st.pop();
                v.push_back(top->val);
                prev = top;
            }
            else
            {
                cur = top->right;
            }
        }
        return v;
    }
};

总结

二叉树的前序遍历、中序遍历、后序遍历的非递归遍历三种方法都是类似的,差别在于访问栈顶的元素的时机不同,访问控制不同。其中前序和中序大致相同,而后序需要去进行判断栈顶的右子树情况。

到此这篇关于C++二叉树的前序中序后序非递归实现方法详细讲解的文章就介绍到这了,更多相关C++二叉树的前序中序后序实现内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • C++知识点之成员函数中const的用法

    C++知识点之成员函数中const的用法

    这篇文章主要介绍了C++知识点之成员函数中const的用法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • c语言中abs()和fabs()的区别点整理

    c语言中abs()和fabs()的区别点整理

    在本篇文章里小编给大家分享的是关于c语言abs()和fabs()的区别,有需要的朋友们可以参考学习下。
    2020-02-02
  • C/C++利用栈和队列实现停车场管理系统

    C/C++利用栈和队列实现停车场管理系统

    数据结构的课程设计一般都不是很好理解,今天小编为大家总结了一下c和c++版本的常见栈和队列的的停车场管理程序,需要的小伙伴可以参考一下
    2022-06-06
  • C语言实现去除字符串中空格的简单实例

    C语言实现去除字符串中空格的简单实例

    下面小编就为大家带来一篇C语言实现去除字符串中空格的简单实例。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-05-05
  • Qt读写ini文件之QSettings用法

    Qt读写ini文件之QSettings用法

    这篇文章主要为大家介绍了Qt读写ini文件之QSettings的使用方法,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    C语言sizeof与字符串处理与动态内存分配及main函数参数详解

    这篇文章主要介绍了C语言字符串处理函数、sizeof、动态内存分配函数、main函数参数问题,static在修饰变量的时候,如果是修饰全局变量,则跟全局变量功能一样,通过示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • C++迭代器失效解决办法详解

    C++迭代器失效解决办法详解

    这篇文章主要介绍了迭代器失效的概念,以及在vector、list和map等容器中插入和删除操作导致迭代器失效的情况,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-12-12
  • C语言 条件判断详细介绍

    C语言 条件判断详细介绍

    本文主要讲解C语言 条件判断,这里整理了相关资料,详细说明了判断语句知识要点,希望能帮助学习C语言的同学
    2016-08-08
  • Qt Quick Designer灰色或者禁用的解决

    Qt Quick Designer灰色或者禁用的解决

    本文主要介绍了Qt Quick Designer灰色或者禁用的解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • C++中关于constexpr函数使用及说明

    C++中关于constexpr函数使用及说明

    这篇文章主要介绍了C++中关于constexpr函数使用及说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论