首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode刷题(19)【简单】二叉树的前&&中&&后遍历(非递归)(C++)

LeetCode刷题(19)【简单】二叉树的前&&中&&后遍历(非递归)(C++)

作者头像
半生瓜的blog
发布于 2023-05-13 05:35:10
发布于 2023-05-13 05:35:10
21900
代码可运行
举报
文章被收录于专栏:半生瓜のblog半生瓜のblog
运行总次数:0
代码可运行

精华在于进栈和出栈的时机

94.二叉树的中序遍历

题目

思路: 中序遍历的顺序是,左 - 根 - 右 创建一个栈来存储结点,创建一个vector来存储中序遍历的值 从根结点开始,只要该结点有左子树,就将该结点压进栈中。 直到root为空。 取出栈顶元素,栈顶元素出栈,将该结点值存进recv。 … 剩下的只可意会不可言传了,

感谢这位老哥分享——链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    //中序遍历顺序-左-中-右
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int>recv;
        stack<TreeNode*> Tstack;
       
       //当前结点不为空或当前栈不为空
       while(root || !Tstack.empty())
       {
           while(root)
           {
               //只要当前结点不为空就往栈里面压
               Tstack.push(root);
               root = root->left;
           }
           //此时栈顶元素为根节点左侧树最左的左子树
           //取到该结点
           root = Tstack.top();
           Tstack.pop();
           //pop出栈,存进recv中
           recv.push_back(root->val);
           root = root->right;
       }
        return recv;
    }
};

递归方法

144.二叉树的前序遍历

题目

非递归 感谢这位老哥分享——链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    
    vector<int> preorderTraversal(TreeNode* root) {
    vector<int>recv;
    stack<TreeNode*>Tstack;
    while(root || !Tstack.empty())
    {
        while(root)
        {
            recv.push_back(root->val);
            Tstack.push(root);
            root = root->left;
        }
        root = Tstack.top();
        Tstack.pop();
        root = root->right;
    }    
    return recv;
    }
};

145.二叉树的后序遍历

题目

一直往栈里面往左节点,压到左边最后一个做结点,往回pop,判断当前这个结点是否右结点,有右结点就输出,最后判断自己。

感谢这位老哥分享思路—链接

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int>result;
        stack<TreeNode*>Tstack;
        TreeNode* cur = root;
        TreeNode* prev = nullptr;//记录cur上一个指向的结点,比cur走慢一步

        while(!Tstack.empty() || cur)
        {
            //只有cur不为空,就一直往里面压左节点
            while(cur) 
            {
                Tstack.push(cur);
                cur =cur->left;
            }
            cur = Tstack.top();
            //如果当前结点没有右结点 ||  右结点已经访问过了
            if(!cur->right || prev == cur->right)
            {
                Tstack.pop();
                result.push_back(cur->val);
                prev = cur;
                //要从栈里面往外面吐结点,所以要将cur置为null
                cur = nullptr;
            }   
            else
            {
                cur = cur->right;
            }
        }
        return   result;
    }
};

大致流程感觉

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021-10-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【二叉树进阶】二叉树的前中后序遍历(非递归迭代实现)
对它进行非递归的前序遍历,它是这样搞的: 前序遍历是根、左子树、右子树 所以首先从根结点开始,顺着访问左子树:8、3、1 然后现在还有谁没访问? 🆗,是1的左子树、3的左子树,和8的左子树。 所以下面倒着访问1、3、8的左子树就行了。 所以非递归的前序遍历是这样处理的: 他把一棵二叉树分为两个部分:
YIN_尹
2024/01/23
2960
【二叉树进阶】二叉树的前中后序遍历(非递归迭代实现)
【C++】二叉树的前序中序后序非递归实现
前序遍历的顺序是根、左、右。任何一颗树都可以认为分为左路节点,左路节点的右子树。先访问左路节点,再来访问左路节点的右子树。把访问左路节点的右子树看成一个子问题,就可以完整递归访问了。
平凡的人1
2023/10/15
3530
【C++】二叉树的前序中序后序非递归实现
二叉树oj以及前中后序非递归写法
给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。
始终学不会
2023/10/17
2460
二叉树oj以及前中后序非递归写法
C++: 二叉树进阶面试题
根据前序遍历创建二叉树, 再递归子树之前需要加括号, 但是题目要求省略不必要的括号, 通过观察可发现
用户11317877
2024/10/16
890
C++: 二叉树进阶面试题
LeetCode——二叉树的非递归遍历
原题链接:https://leetcode.cn/problems/binary-tree-preorder-traversal/
有礼貌的灰绅士
2023/04/17
2840
LeetCode——二叉树的非递归遍历
二叉树的非递归遍历
                                                            二叉树的非递归遍历
bear_fish
2018/09/20
8950
二叉树的遍历——递归和非递归
二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。   1.递归实现 void pre_order(BTre
猿人谷
2018/01/17
1.3K0
二叉树的非递归遍历(递归和非递归)
二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中, 前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 一.前序遍历    前序遍历按照“根结点-左孩子-右孩子”的顺序进行访问。   1.递归实现 void pre_order(BTree
猿人谷
2018/01/17
1.7K0
二叉树经典OJ题(2)
技巧:在递归过程中,我们想要有一个变量记录全过程(该题中的prev),第一种方法就是设置成全局变量,第二种方法就是传引用。
小陈在拼命
2024/04/20
850
二叉树经典OJ题(2)
【数据结构】二叉树进阶算法题
在数据结构初阶部分已经讲了常见的一些经典二叉树相关的算法题题目,二叉树部分难度还是有的,所以一些不适合用C语言实现和一些难度越大一些的算法题(二叉树非递归等)我们就放到这里用C++进行讲解。
ZLRRLZ
2025/08/04
890
【数据结构】二叉树进阶算法题
C++【二叉树进阶试题】
这是一篇关于 二叉树 题解博客,主要包含以下题目,可根据当前文章中的目录随意跳转查看
北 海
2023/07/01
2970
C++【二叉树进阶试题】
二叉树的前 中 后序的非递归实现(图文详解)
补充知识: 二叉树的前序遍历,又称为先序遍历,是指先访问节点本身,然后按照先左后右的顺序遍历其左右子树。具体步骤如下:
初阶牛
2023/10/22
7030
二叉树的前 中 后序的非递归实现(图文详解)
【代码随想录】二刷-二叉树
二叉树中章节中,相对于迭代,递归有时候会更好理解,部分题用到了马上要刷的回溯算法。
半生瓜的blog
2023/05/13
8670
【代码随想录】二刷-二叉树
【C++】二叉搜索树
二叉搜索树又称二叉排序树,可以简写成 BST,它或者是一棵空树,或者是具有以下性质的二叉树:
YoungMLet
2024/03/01
1750
【C++】二叉搜索树
二叉树构建,先序,中序,后序遍历(以及非递归实现),广度优先遍历
二叉树是一类简单而又重要的树形结构,在数据的排序、查找和遍历方面有着广泛的应用。由于其清晰的结构,简单的逻辑,广泛的应用和大量的指针操作,在面试过程屡见不鲜,快被面试官玩坏了。相关的问题在百行代码内就可解决,特别适合手写代码,因此我们要充分做好准备,迎接面试时关于二叉树的相关问题,尤其是手写代码。
恋喵大鲤鱼
2018/08/03
20.7K0
二叉树构建,先序,中序,后序遍历(以及非递归实现),广度优先遍历
非递归中序遍历二叉树(leetcode 94)
中序遍历按照“左子树 > 根结点 > 右子树”的顺序进行访问。而在访问左子树或右子树的时候我们按照同样的方式遍历,直到遍历完整棵树。
恋喵大鲤鱼
2022/12/02
4270
非递归中序遍历二叉树(leetcode 94)
【数据结构与算法】二叉树的非递归遍历算法实现详解(常见面试题)
​ 首先讲讲为什么要去实现非递归的遍历呢,因为递归的缺陷就是空间问题,栈溢出是有可能存在的情况,所以我们必须尝试着去迭代遍历!
利刃大大
2025/02/03
1730
【数据结构与算法】二叉树的非递归遍历算法实现详解(常见面试题)
【二叉树进阶】leetcode&牛客 二叉树进阶面试题
所以,解这道题之前,我们可以先来分析一下,哪些情况需要省略空括号,哪些情况不能省略 那对照着图我们很容易得出,括号的处理应该是这样的:
YIN_尹
2024/01/23
1840
【二叉树进阶】leetcode&牛客 二叉树进阶面试题
【Leetcode】二叉树的最近公共祖先,二叉搜索树转换成排好序的双向链表,前序遍历与中序遍历构造二叉树
观察上图,节点1和节点4的最近公共祖先是3,这是不是很像相交链表的问题,关于相交链表,曾经我在另一篇文章里写到过,读者可以参考:反转链表 合并链表 相交链表
aosei
2024/01/23
2020
【Leetcode】二叉树的最近公共祖先,二叉搜索树转换成排好序的双向链表,前序遍历与中序遍历构造二叉树
二叉树的遍历(深度优先+广度优先)
二叉树的深度优先遍历有三种方式,先序(先根次序)、中序(中根次序)和后序(后根次序)遍历。
恋喵大鲤鱼
2020/05/25
4.6K0
推荐阅读
相关推荐
【二叉树进阶】二叉树的前中后序遍历(非递归迭代实现)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档