【算法第十一天7.25】二叉树前、中、后递归、非递归遍历

这篇具有很好参考价值的文章主要介绍了【算法第十一天7.25】二叉树前、中、后递归、非递归遍历。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链接:力扣94-二叉树中序遍历

链接:力扣144-二叉树前序遍历

链接:力扣145-二叉树后序遍历

树的结构

 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }

================================================

链接:力扣94-二叉树中序遍历

递归

思路

1、确定返回值和方法参数:需要集合来存放树各节点的值,最后打印出来,所以需要一个list集合作为参数,不断迭代;除此之外不需要有返回值

2、确定终止条件:当前节点为空时,则需要结束本次方法调用(结束本次递归),用return

3、确定单次递归逻辑:中序遍历,左中右 处理,对root的处理就是加入到集合中

class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        inorder(root, res);
        return res;
    }

    public void inorder(TreeNode root, List<Integer> list){
        // 当前传入的root为null结束本方法的执行,继续下面方法的执行
        if(root == null) return;
        inorder(root.left,list);
        list.add(root.val);
        inorder(root.right,list);
    }
}

非递归

思路

1、终止条件:栈为空 且 cur节点为空

2、如果左孩子一直不为空,则需要一直入栈

3、左孩子为空后,则开始pop节点(入集合),pop出的节点也要看其左孩子,所以cur要指向pop出的节点,继续判断其左孩子

class Solution {
    public List<Integer> inorderTraversal(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        TreeNode cur = root;
        // 这里除了判空,也有可能栈空了,但是右节点还没有处理(未入栈)
        while(!stack.isEmpty() || cur != null){
            // 如果左孩子一直存在,则要一路把左孩子都存进去,直到cur为空
            if(cur != null){
                stack.push(cur);
                cur = cur.left;
            // cur为空时,则说明左边已经循环到低了,可以开始pop并入集合
            // 也需要开始处理右节点,右节点处理也是要一路把左节点先存进去,重复上述步骤
            // 所以要将右节点命为cur,也就是要处理的节点
            }else{
                cur = stack.pop();
                res.add(cur.val);
                cur = cur.right;
            }
        }
        return res;
    }
}

链接:力扣144-二叉树前序遍历

递归

思路

1、确定返回值和方法参数:需要集合来存放树各节点的值,最后打印出来,所以需要一个list集合作为参数,不断迭代;除此之外不需要有返回值

2、确定终止条件:当前节点为空时,则需要结束本次方法调用(结束本次递归),用return

3、确定单次递归逻辑:前序遍历,中左右 处理,对root的处理就是加入到集合中,对左右节点处理,就是不断递归

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        preorder(root,res);
        return res;
    }
    public void preorder(TreeNode root, List<Integer> list){
        if(root == null) return;
        list.add(root.val);
        preorder(root.left,list);
        preorder(root.right,list);
    }
}

非递归

思路

1、先让root入栈,接着pop出来,定义为node,先把node.val添加到集合中,再去判断其是否有左右孩子,一定先右后左,出栈顺序相反

2、循环终止条件:栈为空则说明所有节点已经处理完毕

class Solution {
    public List<Integer> preorderTraversal(TreeNode root){
        Stack<TreeNode> stack = new Stack<>();
        List<Integer> res = new ArrayList<>();
        if(root == null) return res;
        stack.push(root);
        // 这里除了判空,不需要其它条件,即使出栈空了,后面还会有节点push进去
        while(!stack.isEmpty()){
            TreeNode node = stack.pop();
            res.add(node.val);
            if(node.right != null) stack.push(node.right);
            if(node.left != null) stack.push(node.left);
        }
        return res;
    }
}

链接:力扣145-二叉树后序遍历

递归

思路

1、确定返回值和方法参数:需要集合来存放树各节点的值,最后打印出来,所以需要一个list集合作为参数,不断迭代;除此之外不需要有返回值

2、确定终止条件:当前节点为空时,则需要结束本次方法调用(结束本次递归),用return

3、确定单次递归逻辑:后序遍历,左右中 处理,对**root(传入节点)**的处理就是加入到集合中,对左右节点处理,就是不断递归

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        postorder(root,res);
        return res;
    }
    public void postorder(TreeNode root, List<Integer> list){
        if(root == null) return;
        postorder(root.left, list);
        postorder(root.right,list);
        list.add(root.val);
    }
}

非递归

思路

入栈顺序中、左、右;出栈顺序:中、右、左;翻转顺序:左、右、中文章来源地址https://www.toymoban.com/news/detail-608269.html

class Solution {
    public List<Integer> postorderTraversal(TreeNode root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        Stack<TreeNode> stack = new Stack<>();
        stack.push(root);
        while (!stack.isEmpty()){
            TreeNode node = stack.pop();
            res.add(node.val);
            if (node.left != null){
                stack.push(node.left);
            }
            if (node.right != null){
                stack.push(node.right);
            }
        }
        // 入栈顺序中、左、右;出栈顺序:中、右、左;翻转顺序:左、右、中
        Collections.reverse(res);
        return res;
    }
}

到了这里,关于【算法第十一天7.25】二叉树前、中、后递归、非递归遍历的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • node 第二十一天 webpack 初见

    为什么需要学习(了解)webpack webpack是前端工程化的基石,webpack又是基于node进行文件打包bundle,所以作为前端起手学习node服务端开发,同时学习webpack是很有必要的。 随着vite的出现,vue这一脉可能也许不再需要学习webpack了,但是需要知道的是, 打包一定是前端工程化绕不

    2024年01月16日
    浏览(34)
  • 学C的第三十一天【通讯录的实现】

    ========================================================================= 相关代码gitee自取 :C语言学习日记: 加油努力 (gitee.com)  ========================================================================= 接上期 : 学C的第三十天【自定义类型:结构体、枚举、联合】_高高的胖子的博客-CSDN博客  ==============

    2024年02月15日
    浏览(41)
  • 从零开始的力扣刷题记录-第六十一天

    题目描述: 给定由一些正数(代表长度)组成的数组 nums ,返回 由其中三个长度组成的、面积不为零的三角形的最大周长 。如果不能形成任何面积不为零的三角形,返回 0。 题解: 排序后从后往前遍历,取最大的三个边,如果满足两边之和大于第三边则返回,否则整体向前

    2024年02月09日
    浏览(40)
  • 从零开始的力扣刷题记录-第五十一天

    题目描述: 给你一棵二叉搜索树的 root ,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。 题解: 中序遍历存储节点后按顺序连接即可 代码(Go): 题目描述: 小扣在秋日市集发

    2024年02月08日
    浏览(32)
  • 谷粒商城第十一天-完善商品分组(主要添上关联属性)

    目录 一、总述 二、前端部分 2.1 改良前端获取分组列表接口及其调用 2.2 添加关联的一整套逻辑 三、后端部分 四、总结 前端部分和之前的商品品牌添加分类差不多。 也是修改一下前端的分页获取列表的接口,还有就是加上关联的那一套逻辑,包括基本构件的引入、数据域的

    2024年02月13日
    浏览(31)
  • 15天学习MySQL计划-MySQL工具(进阶篇)-第十一天

    1.mysql 该mysql 不是指MySQL服务,而是指MySQL的客户端工具。 -e选项可以在MySQL客户端执行SQL语句,而不用连接到MySQL数据库再执行,对于一些批处理脚本,这种方式尤其方便。 2.mysqladmin mysqladmin是一个执行管理操作的客户端程序。可以用它来检查服务器的配置和当前状态,创建并

    2024年02月01日
    浏览(48)
  • 秒懂百科,C++如此简单丨第二十一天:栈和队列

    目录 前言 Everyday English 栈(Stack) 图文解释 实现添加删除元素 实现查看清空栈 完整代码 运行示例 栈的选择题 队列(Queue) 图文解释 队列的基本用法 完整代码  运行结果  队列的好处  结尾  今天我们将学习两个新的数据结构——栈和队列。 A friend in need is a friend indeed

    2024年02月20日
    浏览(29)
  • 【三十天精通Vue 3】第十一天 Vue 3 过渡和动画详解

    ✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3

    2023年04月17日
    浏览(34)
  • 第六十一天学习记录:C语言进阶:C语言预处理1

    在ANSI C的任何一种实现中,存在两个不同的环境。 第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令。第2种是执行环境,它用于实际执行代码。 翻译环境 ![在这里插入图片描述](https://img-blog.csdnimg.cn/04bd03e2cb554aa298fb6a8349722f89.png 上图截取自比特科技免费课程

    2024年02月07日
    浏览(33)
  • 【80天学习完《深入理解计算机系统》】第十一天 3.4 跳转指令

    专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录) 文章字体风格: 红色文字表示:重难点★✔ 蓝色文字表示:思路以及想法★✔ 如果大家觉得有帮助的话,感谢大家帮

    2024年02月11日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包