树的非递归遍历

树后序遍历的非递归实现 树的后序遍历非递归实现 今天在刷leetcode的时候发现自己对于后序遍历非递归实现不是很了解,所以在这里记录自己的一点心得。 有两种比较好的方法: 第一种:通过前序遍历来然后逆序 1.前序遍历的过程是:根 - > 左 - > 右 2.后序遍历的过程是:左 - > 右 - > 根 3.现在将前序的反转的结果是:右 - > 左 - > 根 4.于是我们只需要把前序... 阅读详情

1.先序(我只把这些当模板)

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==NULL)return res;
        stack<TreeNode*> ms;
        TreeNode* p=root;
        while(!ms.empty()||p)
        {
            if(p)
            {
                res.push_back(p->val);
                ms.push(p);
                p=p->left;
            }
            else if(!ms.empty())
            {
                p=ms.top();
                ms.pop();
                if(p)p=p->right;
            }
        }
        return res;
    }
};


2.中序

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==NULL)return res;
        stack<TreeNode*> ms;
        TreeNode* p=root;
        while(!ms.empty()||p)
        {
            if(p)
            {
                ms.push(p);
                p=p->left;
            }
            else
            {
                p=ms.top();
                res.push_back(p->val);
                ms.pop();
                p=p->right;
            }
        }
        return res;
    }
};



3.后序

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==NULL)return res;
        stack<TreeNode*> ms;
        TreeNode *p=root,*pre=NULL;
        while(!ms.empty()||p)
        {
            if(p)
            {
                ms.push(p);
                p=p->left;
            }
            else
            {
                p=ms.top();
                if(p->right!=NULL&&p->right!=pre)p=p->right;
                else 
                {
                    res.push_back(p->val);
                    ms.pop();
                    pre=p;
                    p=NULL;
                }
            }
        }
        return res;
    }
};




看看大神的代码(以下代码来源于leetcode)

1.先序(看起来很优美)

class Solution {
public:
vector<int> preorderTraversal(TreeNode *root) {
    if (root==NULL) {
        return vector<int>();
    }
    vector<int> result;
    stack<TreeNode *> treeStack;
    treeStack.push(root);
    while (!treeStack.empty()) {
        TreeNode *temp = treeStack.top();
        result.push_back(temp->val);
        treeStack.pop();
        if (temp->right!=NULL) {
            treeStack.push(temp->right);
        }
        if (temp->left!=NULL) {
            treeStack.push(temp->left);
        }
    }
    return result;
}
};



2.中序( o(1)空间复杂度)

Morris traversal

 
 

public class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        if(root == null) return new ArrayList<Integer>();
        List<Integer> res = new ArrayList<Integer>();
        TreeNode pre = null;
        while(root != null){
        	if(root.left == null){
        		res.add(root.val);
        		root = root.right;
        	}else{
        		pre = root.left;
        		while(pre.right != null && pre.right != root){
        			pre = pre.right;
        		}
        		if(pre.right == null){
        			pre.right = root;
        			root = root.left;
        		}else{
        			pre.right = null;
        			res.add(root.val);
        			root = root.right;
        		}
        	}
        }
        return res;
    }
}


3.后序(美得不敢直视)

vector<int> postorderTraversal(TreeNode *root) {
    vector<int> v;
    if (!root) return v;
    
    stack<TreeNode *> s;
    s.push(root);
    
    TreeNode *p = NULL;
    while(!s.empty()) {
        p = s.top();
        s.pop();
        v.insert(v.begin(), p->val);
        if (p->left) s.push(p->left);
        if (p->right) s.push(p->right);
    }
    
    return v;
}




树的三种非递归遍历(二叉树) 树的非递归遍历是指使用栈(Stack)来模拟递归过程,从而实现树的遍历。以下是三种常见的非递归遍历算法:前序遍历(Pre-order)、中序遍历(In-order)和后序遍历(Post-order)的详细实现,包括原理、步骤、图示法表示步骤和代码关键行注释。以下是一个完整的示例程序,演示如何使用非递归方法进行前序、中序和后序遍历。前序遍历的顺序是:根节点 -> 左子树 -> 右子树。中序遍历的顺序是:左子树 -> 根节点 -> 右子树。后序遍历的顺序是:左子树 -> 右子树 -> 根节点。 阅读详情

相关推荐

树的三种遍历的非递归算法

树的三种遍历的非递归算法,大家互相学习

树的三种遍历非递归操作

1.前序遍历 前序遍历是:根节点-左节点-右节点;和深度优先遍历一致,这里可以参照之前写的 BFS(广度优先遍历)和DFS(深度优先遍历) 其文章链接:https://blog.youkuaiyun.com/sdshdutx/article/details/106721827 2.中序遍历 中序遍历是:左子树-根节点-右子树(每一个子树都满足这种访问方式),如下所示:输出为5->2->6->1->4 那么我们在经过某一个子根节点时前面节点不能释放, 因为需要遍历到其底部,才算完成左边子树的遍

sdshdutx的博客 1851

sqoop抽取mysql的数据到hive表里面,字段内容被自动截取,导致字段不全的问题解决

今天央视重新转播NBA,写篇博客纪念一下这个重要的日子,湖人的表现就呵呵了!!!! 强行转到博客的主题来 mysql的字段属性:该字段能存下的值比如:“山东” `province` varchar(3) NOT NULL COMMENT '省份' 用sqoop sqoop import --connect "jdbc:mysql://xxxxxx:3306/xxxxxx?tinyInt1isBit=false&zeroDateTimeBehavior=convertToNull..

放肆桀骜 963

数据结构6.2——树的遍历(递归/非递归)

遍历一棵树实际上就是把树的结点排成一个线性序列的过程。

clllllz_的博客 1909

夜间灯光遥感数据介绍及下载汇总

夜间灯光遥感数据介绍及下载汇总

qq_43874102的博客 1万+

硬件基础(4):(6)高精度ADC设计中模拟地与数字地的划分与连接

在实际 PCB 设计中,**接地与布线**对于获得干净的参考电压和高精度 ADC 测量至关重要。下面详细阐述**如何在硬件层面减少数字噪声耦合到模拟电路、保障参考电压的稳定性**。

FCZlll的博客 2643

C语言-非递归完成树的三种遍历

学习两天半,我终于明白了非递归遍历树,赶快来学一学!!!

Jaye513的博客 1138

Windows 11 的C盘User(用户)文件夹下的用户文件夹名称的修改

背景介绍:由于系统重装导致Windows 11的系统用户名与C盘User(用户)文件夹下的用户名文件夹(公用文件夹旁边的文件夹)出现名称不一致,事例中系统用户名命名为“寂萧”,User(用户)文件夹下的文件夹名称却是“77555”。【QQ邮箱前五位真的真的看着很别扭】注:改名有风险,三思而后行。User(用户)文件夹下的用户名是中文在某些软件的应用场景下产生不便,导致很多软件莫名其妙报错,甚至无法使用,笔者不建议修改为中文名。//和笔者一样的强迫症除外//

2302_79084172的博客 10万+

详细讲解二叉树三种遍历方式的递归与非递归实现

二叉树是一种非常重要的数据结构,很多其他数据机构都是基于二叉树的基础演变过来的。二叉树有前、中、后三种遍历方式,因为树的本身就是用递归定义的,因此采用递归的方法实现三种遍历,不仅代码简洁且容易理解,但其开销也比较大,而若采用非递归方法实现三种遍历,则要用栈来模拟实现(递归也是用栈实现的)。下面先简要介绍三种遍历方式的递归实现,再详细介绍三种遍历方式的非递归实现。 一、三种...

473687880 3942

Dify安装使用说明

dify可以说是一个功能不错的LLMOps,可以通过dify集中管理模型,可以通过界面创建AI应用,可以上传文档形成知识库,可以创建自定义工具(API),并可以对外提供API。相关功能类似Openai的GPTs或智谱的智能体,其他大厂的大模型也有类似功能,不过貌似只有dify是开源的。这就为个人本地部署AI应用提供了便利。

龙井茶的Sky 1万+

LTspice基础教程-009.LTspice波形测量

<<==上一篇:LTspice基础教程-008.LTspice PWL设置 >>==下一篇:LTspice基础教程-010. 首篇博客文末提供所有相关资源百度网盘分享链接

gaoyong_wang的博客 4万+

python 非递归遍历树

一般遍历树的方式有前序遍历、中序遍历、后序遍历以及层序遍历四种。 顺序是相对于根节点而言的,前序遍历就是根节点在前,左孩子其次,右孩子最后。中序遍历的顺序就是左孩子,根节点,右孩子。后序遍历顺序就是左孩子,右孩子,根节点。层序遍历则是一层一层的遍历。除了层序遍历外,其他三种遍历方式采用递归很容易能写出来,这里主要实现这四种遍历方式的非递归实现方法。 非递归前序遍历 def preOrder(...

jingjing_94的博客 1714

Python爬虫实战:高效爬取中国版权登记数据

本文将详细介绍如何使用Python最新技术栈构建一个高效、稳定的中国版权登记数据爬虫系统。我们将使用Playwright+Asyncio实现无头浏览器自动化,结合Redis分布式任务队列和MongoDB数据存储,打造一个能够应对反爬机制的企业级数据采集方案。文章包含完整代码实现、性能优化技巧以及法律合规建议,帮助开发者快速掌握大规模数据采集的核心技术。本文详细介绍了2024年使用Python最新技术栈构建中国版权登记数据爬虫的完整方案。基于Playwright的无头浏览器自动化。

2201_76125261的博客 1898

树的遍历非递归实现

java 树的遍历非递归实现 public class TreeToSequence { public int[][] convert(Node root) { //特殊输入 if (root == null) { return null; } //由于树的结点数目不知道,因此遍历过的结点只能存放在...

hanliuxi4265的博客 780

【DRAM存储器四十六】LPDDR5介绍--基本操作之行操作、读、写

简述LPDDR5的行操作和读写时序

highman110的博客 759

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

树的后序遍历 (非递归) (Java)

一、问题 1 2 3 4 5 6 7 输出该树后序遍历的结果 二、代码 Java @Data public class Node { private Integer id; private Node left; pri...

rico 817

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

树的遍历(非递归)

树的非递归遍历几种实现,C语言包括测试程序

zengwh 1424

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

树的前序遍历 (非递归) (Java)

一、问题 1 2 3 4 5 6 7 输出该树前序遍历的结果 二、代码 Java @Data public class Node { private Integer id; private Node left; pri...

rico 556

【树】二叉树的后序遍历——非递归写法

树的前序和中序遍历我们都已经写完了,现在我们来写一下树的后序遍历的非递归写法。 我自己的思路: 一些基础的知识可以参看我之前的前序遍历的文章。总之我稍微模拟了一下,得出了以下重要结论: 首先这个过程有点复杂,我们可能得用一个循环来多次执行,因为是不定次数的循环,所以我们选择while。 如何实现这个while循环?我的一个基本思路就是每次循环体只处理一个状态,然后转换成另一个状态,交给下一...

qq_43338695的博客 2630

树的前中后序遍历的非递归实现

先序遍历 vector<int> preorderTraversal(TreeNode* root) { if(!root) return {}; vector<int > res; stack<TreeNode* > s; s.push(root); while(!s.empty(...

a13602955218的博客 211

非递归遍历树

花了很久完成了这个非递归实现树的遍历的代码,中间在堆栈的使用方面出了一些问题,耽误了很久,最后在后序遍历上也纠结了很久。现在,把代码分享一下: /* ************************************************ *Name : Bittree all operation *Date : 2014-12-18 *Author : marksman *A

Universe 963
上一篇: 最长递增子序列
下一篇: 二分图最大匹配
WayToAccept
博客等级 码龄14年 21粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值