【二叉树part01】| 二叉树的递归遍历、二叉树的迭代遍历、二叉树的统一迭代遍历

news2024/11/18 17:51:48

目录

✿二叉树的递归遍历❀

☞LeetCode144.前序遍历

☞LeetCode145.二叉树的后序遍历 

☞LeetCode94.二叉树的中序遍历 

✿二叉树的迭代遍历❀

 ☞LeetCode144.前序遍历

 ☞LeetCode145.二叉树的后序遍历 

 ☞LeetCode94.二叉树的中序遍历 

✿二叉树的统一迭代遍历❀ 

 ☞LeetCode144.前序遍历

 ☞LeetCode145.二叉树的后序遍历 

☞LeetCode94.二叉树的中序遍历  


✿二叉树的递归遍历❀

☞LeetCode144.前序遍历

链接:144.二叉树的前序遍历

给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 

前序遍历:根左右 

递归三部曲:

每次写递归,都按照这三要素来写,可以保证大家写出正确的递归算法!

  1. 确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

  2. 确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

  3. 确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

public List<Integer> preorderTraversal(TreeNode root) {
        // 树中节点数目在范围 [0, 100] 内
        // 根左右
        List<Integer> result=new ArrayList<>();
        preorder(root,result);
        return result;
    }
    public void preorder(TreeNode root,List<Integer> result){
        if(root==null){
            return;
        }
        result.add(root.val);  //根
        preorder(root.left,result);  // 左
        preorder(root.right,result);  //右
    }

☞LeetCode145.二叉树的后序遍历 

链接:145.二叉树的后序遍历

给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 

后序遍历:左右根 

public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        postorder(root,result);
        return result;
    }
    public void postorder(TreeNode root,List<Integer> result){
        // 左右根
        if(root==null){
            return;
        }
        postorder(root.left,result);
        postorder(root.right,result);
        result.add(root.val);

    }

☞LeetCode94.二叉树的中序遍历 

链接:94.二叉树的中序遍历

给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。

 中序遍历:左根右

public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> result=new ArrayList<>();
        inorder(root,result);
        return result;
    }
    public void inorder(TreeNode root,List<Integer> result){
        // 左根右
        if(root==null){
            return;
        }
        inorder(root.left,result);
        result.add(root.val);
        inorder(root.right,result);
    }

二叉树的递归遍历方式还是挺简单的,要知道前中后序的遍历顺序就能写出来 

✿二叉树的迭代遍历❀

 ☞LeetCode144.前序遍历

链接:144.二叉树的前序遍历

能用递归实现的,栈也可以,二叉树迭代法的实现就是用栈,本来的前序遍历的顺序是根左右、因为栈是先进后出的,所以入栈顺序是根右左,代码如下: 

public List<Integer> preorderTraversal(TreeNode root) {
        // 迭代法
        List<Integer> result=new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> st=new Stack<>();
        st.push(root);
        // 根右左
        while(!st.isEmpty()){
            TreeNode node=st.pop();
            result.add(node.val);
            if(node.right!=null){
                st.push(node.right);
            }
            if(node.left!=null){
                st.push(node.left);
            }
        }
        return result;

    }

 ☞LeetCode145.二叉树的后序遍历 

链接:145.二叉树的后序遍历

 后序遍历的迭代法和前序遍历差不多,后序遍历的顺序是左右根,反转一下就变成了根右左,这样就和前序遍历很相似了,入栈顺序是根左右,最后的结果再进行一个反转,代码如下:

public List<Integer> postorderTraversal(TreeNode root) {
        // 迭代法
        List<Integer> result=new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> st=new Stack<>();
        st.push(root);
        while(!st.isEmpty()){
            TreeNode node=st.pop();
            result.add(node.val);
            if(node.left!=null){
                st.push(node.left);
            }
            if(node.right!=null){
                st.push(node.right);
            }
        }
//        反转
        List<Integer> list=new ArrayList<>();
        for (int i = result.size()-1; i >=0; i--) {
            list.add(result.get(i));
        }
        return list;

    }

 ☞LeetCode94.二叉树的中序遍历 

链接:94.二叉树的中序遍历

到中序遍历这里就不一样了,因为前序遍历和后序遍历都可以转化为第一个遍历的节点是根节点,而中序遍历是要从最左边的节点开始,我下面的做法是将节点遍历至最左边,然后出栈,转向右节点,代码如下:

public List<Integer> inorderTraversal(TreeNode root) {
        // 迭代法
        List<Integer> result=new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> st=new Stack<>();
        TreeNode cur=root;
        while(cur!=null  || !st.isEmpty()){
            if(cur!=null){
                st.push(cur);
                cur=cur.left;
            }else{
                cur=st.pop();
                result.add(cur.val);
                cur=cur.right;
            }
        }
        return result;

    }

✿二叉树的统一迭代遍历❀ 

 ☞LeetCode144.前序遍历

链接:144.二叉树的前序遍历

 二叉树的统一迭代遍历,前中后序的代码只是顺序不同,会了一个其他的自然就会了,代码如下:

public List<Integer> preorderTraversal(TreeNode root) {
        // 统一迭代法
        List<Integer> result=new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> st=new Stack<>();
        st.push(root);
        while(!st.isEmpty()){
            TreeNode node=st.peek();
            if(node==null){
                st.pop(); //弹出空节点
                result.add(st.pop().val);
            }else{
                st.pop();
                if(node.right!=null){
                    st.push(node.right);  //右
                }
                if(node.left!=null){
                    st.push(node.left);  //左
                }
                
                st.push(node);   // 中
                st.push(null);   // 空
            }
        }
        return result;
    }

 ☞LeetCode145.二叉树的后序遍历 

链接:145.二叉树的后序遍历

public List<Integer> postorderTraversal(TreeNode root) {
        //统一迭代法
        List<Integer> result=new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> st=new Stack<>();
        st.push(root);
        while(!st.isEmpty()){
            TreeNode node=st.peek();
            if(node==null){
                st.pop();   //弹出空节点
                result.add(st.pop().val);
            }else{
                st.pop();
                st.push(node);  //中
                st.push(null);   // 空
                if(node.right!=null){
                    st.push(node.right);  // 右
                }
                if(node.left!=null){
                    st.push(node.left);   // 左
                }
            }
        }
        return result;
    }

☞LeetCode94.二叉树的中序遍历  

链接:94.二叉树的中序遍历

public List<Integer> inorderTraversal(TreeNode root) {
        // 统一迭代遍历
       
        List<Integer> result=new ArrayList<>();
        if(root==null){
            return result;
        }
        Stack<TreeNode> st=new Stack<>();
        st.push(root);
        while(!st.isEmpty()){
            TreeNode node=st.peek();
            if(node==null){
                st.pop();  // 弹出空节点
                result.add(st.pop().val);  //放入结果集
            }else{
                st.pop();  // 先出栈
                if(node.right!=null){
                    st.push(node.right);  // 右
                }
                st.push(node);  // 中
                st.push(null);   // 空
                if(node.left!=null){   // 左
                    st.push(node.left);
                }
            }
        }
        return result;
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/670196.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CTFshow-pwn入门-前置基础pwn32-pwn34

FORTIFY_SOURCE FORTIFY_SOURCE(源码增强)&#xff0c;这个其实有点类似与Windows中用新版Visual Studio进行开发的时候&#xff0c;当你用一些危险函数比如strcpy、sprintf、strcat&#xff0c;编译器会提示你用xx_s加强版函数。 FORTIFY_SOURCE本质上一种检查和替换机制&am…

算法程序设计 之 矩阵连乘(3/8)

一、实验目的&#xff1a; 理解动态规划算法的基本思想和设计步骤&#xff1b; 掌握动态规划算法的典型应用范例——矩阵连乘。 二、实验内容 矩阵连乘 给定n个可乘的数字矩阵A1,…,An&#xff0c;以及矩阵的阶p0* p1, p1* p2,…, pn-1* pn,求给定矩阵链的最优计算次序使得所需…

JavaWeb之文件的上传和下载

文章目录 文件的上传基本介绍文件上传的HTTP协议的说明commons-fileupload.jar 常用API介绍说明fileupload类库的使用 文件的下载基本介绍和使用说明中文名乱码问题解决方案 文件的上传和下载&#xff0c;是非常常见的功能。很多的系统中&#xff0c;或者软件中都经常使用文件的…

使用spacy做分词的示例

下载数据&#xff1a; aws s3 cp s3://applied-nlp-book/data/ data --recursive --no-sign-request aws s3 cp s3://applied-nlp-book/models/ag_dataset/ models/ag_dataset --recursive --no-sign-request 上面第一份数据接近1GB&#xff0c;第二份接近3GB&#xff1b; 示…

买了一年CSDN年VIP,用着实在太爽

买一年CSDN的年VIP有多爽及使用攻略&#xff01; 一、前言 这段时间&#xff0c;一旦打开CSDN就不断的弹出618活动&#xff0c;在电脑网上打开&#xff0c;一股白嫖之的气息吹来&#xff0c;让人直接忍不住剁手 最后经过近5天的挣扎&#xff0c;我还是受不了CSDN的蛊惑&#…

【工具分享】批量多目录图片如何转换PDF,一次性转换多级目录批量的PDF的转换,合并,输出另存等问题

在工作中我们经常要对图片进行批量转换PDF&#xff0c;由于文件量比较多&#xff0c;目录比较深&#xff0c;工作量比较大比较耗时费力&#xff0c;今天我们分享的主要解决以下问题&#xff1a; 1、单张图片的转换PDF&#xff1a;一张图临时转一下 2、多张图片转换成PDF&…

(二叉树) 1382. 将二叉搜索树变平衡 ——【Leetcode每日一题】

❓1382. 将二叉搜索树变平衡 难度&#xff1a;中等 给你一棵二叉搜索树&#xff0c;请你返回一棵 平衡后 的二叉搜索树&#xff0c;新生成的树应该与原来的树有着相同的节点值。如果有多种构造方法&#xff0c;请你返回任意一种。 如果一棵二叉搜索树中&#xff0c;每个节点…

whistle 使用介绍

什么是 whistle 来自 whistle 官网&#xff1a;http://wproxy.org/whistle/ 的介绍&#xff1a; whistle(读音[ˈwɪsəl]&#xff0c;拼音[wēisǒu])基于Node实现的跨平台web调试代理工具&#xff0c;类似的工具有Windows平台上的Fiddler&#xff0c;主要用于查看、修改HTTP…

在 Python 中对日期和时间进行排序

文章目录 在 Python 中对日期和时间进行排序Python 中的日期时间模块sorted() 方法 使用 sorted() 方法对日期进行排序使用 sorted() 方法对时间进行排序使用 sorted() 方法对日期和时间进行排序总结 Python 是全世界程序员都在使用的一种高级解释型编程语言。 它最著名的是面向…

C++指针对象和异常(10)

异常(exception) 为什么有异常 异常在C用于错误处理&#xff0c;C语言中一般使用返回值表示错误&#xff0c;C对错误处理进行了扩展&#xff0c;统一使用异常机制来处理程序中发生的错误。 C的异常处理包括两个部分 ----- 抛出异常和捕获异常&#xff0c;如果抛出的异常被捕…

BW生成HANA视图权限配置

目录 1 操作步骤1.1 SAP HANA端1、创建用户2、常规信息3、配置角色4、配置系统权限5、配置对象权限 1.2 BW端1、SM30配置数据库连接参数2、SU01创建账户&#xff08;与SAP HANA数据库账户名一致&#xff09;3、使用RS2HANA_VIEW查看配置Assignment TypeDB Connection NameLimit…

如何解决亚马逊、ebay砍单、封号问题?稳定测评方案分析

很多卖家和工作室朋友询问我为什么在测评过程中经常遇到砍单和封号的问题。实际上&#xff0c;这并不难理解&#xff0c;因为测评所涉及的技术问题很多&#xff0c;并不能仅通过解决IP或环境的单一因素来实现稳定的测评。 目前市面上存在许多技术方案&#xff0c;例如指纹浏览…

火山引擎Dataleap治理实践:如何降低数仓建设成本

背景 存储与计算资源是数仓建设的基础&#xff0c;也是数仓建设中的重要成本支出。而随着数仓建设规模逐渐扩大、时间跨度逐渐拉长&#xff0c;将不可避免的出现数据表、任务、字段的冗余。为了减轻资源负担&#xff0c;降低数仓维护成本&#xff0c;需要对数仓建设成本进行治…

微信小程序-上传代码失败,提示分包大小超过限制

开发者可通过开发者工具中的性能扫描工具提前发现代码中的可优化项&#xff1a; 1. 代码包不包含插件大小超过 1.5 M 【建议】小程序代码包单个包大小限制为2M。因此我们建议开发者在开发时&#xff0c;如果遇到单包体积大于1.5M的情况&#xff0c;可以采取分包的方式&#x…

Star History 月度开源精选|2023 年 5 月

收集完五月的 Star History 精选之后我们惊讶地发现居然有那么多好玩好用的项目&#xff0c;无论是低代码&#xff0c;或是可以帮你少写代码&#xff0c;即便不是专业开发者也可以上手了&#xff01; Windmill Windmill 可以看做是 Airplane 的开源替代品 / Temporal 的低代码…

安科瑞产品在泛在电力物联网的应用

安科瑞虞佳豪 泛在电力物联网是以通讯技术为基础发展而来的新型物联网体系&#xff0c;其构建的核心是满足电网能源系统的智能判断和自适应调节能力&#xff0c;这将提高能源的替代和利用能力。对于电力物联网来说&#xff0c;通讯技术是其核心的技术内容之一&#xff0c;也是…

直播平台中的美颜SDK技术探究

而在直播过程中&#xff0c;美颜技术的应用已经成为了不可或缺的一部分。美颜技术能够让主播在镜头前变得更加漂亮自信&#xff0c;也能够提高直播的观看体验。在直播平台中&#xff0c;美颜SDK技术的探究就显得尤为重要。 一、美颜SDK技术的定义 美颜SDK技术是一种通过算法…

Java中的增强 for 循环 foreach

foreach 是 Java 中的一种语法糖&#xff0c;几乎每一种语言都有一些这样的语法糖来方便程序员进行开发&#xff0c;编译期间以特定的字节码或特定的方式来对这些语法进行处理。能够提高性能&#xff0c;并减少代码出错的几率。在 Java 中还有比如 泛型、自动拆箱、自动装箱、内…

【集合数据类型详解】——基础语法

目录索引 集合特点&#xff1a;集合用处&#xff1a;去重操作&#xff1a; 创建集合&#xff1a;实例&#xff1a;实例2&#xff1a; 集合运算&#xff1a;交集&#xff1a;并集&#xff1a;补集&#xff1a;差集&#xff1a; 集合特点&#xff1a; 同一集合中&#xff0c;只能…

ssm酒店住宿预定系统-计算机毕设 附源码 87020

ssm酒店住宿预定系统 目 录 摘要 1 绪论 1.1 研究背景 1.2开发意义 1.3ssm框架 1.4论文结构与章节安排 2 2 酒店住宿预定系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3数据删除流程 2.3 系统功能分析 2.3.1功能性分…