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

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

目录

✿二叉树的递归遍历❀

☞LeetCode144.前序遍历

☞LeetCode145.二叉树的后序遍历 

☞LeetCode94.二叉树的中序遍历 

✿二叉树的迭代遍历❀

 ☞LeetCode144.前序遍历

 ☞LeetCode145.二叉树的后序遍历 

 ☞LeetCode94.二叉树的中序遍历 

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

 ☞LeetCode144.前序遍历

 ☞LeetCode145.二叉树的后序遍历 

☞LeetCode94.二叉树的中序遍历  


✿二叉树的递归遍历❀

☞LeetCode144.前序遍历

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

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

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

前序遍历:根左右 

递归三部曲:

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

  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 ,返回其节点值的 后序遍历 

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

后序遍历:左右根 

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 ,返回 它的 中序 遍历 。

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

 中序遍历:左根右

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.二叉树的中序遍历文章来源地址https://www.toymoban.com/news/detail-493685.html

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;
    }

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

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

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

相关文章

  • 数据结构与算法----详解二叉树的遍历(迭代、递归)

    ❤️ 作者简介 :大家好我是小鱼干儿♛是一个热爱编程、热爱算法的大三学生,蓝桥杯国赛二等奖获得者 🐟 个人主页 :https://blog.csdn.net/qq_52007481 ⭐ 个人社区 :【小鱼干爱编程】 🔥 算法专栏 :算法竞赛进阶指南 💯 刷题网站 :虽然市面上有很多的刷题网站,但是里面

    2024年01月24日
    浏览(51)
  • 用java实现二叉树的后序遍历(递归和迭代)

    目录 1.题目内容 2.用递归实现后序遍历 2.1解题思路 2.2代码 3.用迭代实现后序遍历 3.1解题思路 3.2代码 给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。 示例 1: 输入:root = [1,null,2,3] 输出:[3,2,1] 示例 2: 输入:root = [] 输出:[] 示例 3: 输入:root = [1] 输出:[1]

    2024年02月08日
    浏览(56)
  • 二叉树的遍历(递归法)

    递归的三要素: ①确定递归函数的参数和返回值 ②确定终止条件 ③确定单层递归的逻辑 以前序遍历为例: 1、确定递归函数的参数和返回值: 参数中需要传入list来存放节点的数值,除了这一点就不需要再处理什么数据了也不需要有返回值,因此递归函数的返回类型就是v

    2024年01月17日
    浏览(73)
  • 【LeetCode】105. 从前序与中序遍历序列构造二叉树,106. 从中序与后序遍历序列构造二叉树,144. 二叉树的前序遍历非递归实现,94. 二叉树的中序遍历非递归实现,145. 二叉树的后序

    给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的 先序遍历 , inorder 是同一棵树的 中序遍历 ,请构造二叉树并返回其根节点。 示例 输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] 输出: [3,9,20,null,null,15,7] 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的

    2024年02月04日
    浏览(36)
  • 二叉树的非递归遍历算法

    二叉树的遍历是指访问二叉树的每个结点,且每个结点仅被访问一次。二叉树的遍历可按二叉树的构成以及访问结点的顺序分为4种方式:先序遍历、中序遍历、后序遍历和层次遍历。请至少给出其中一种遍历方式的非递归算法的思路和代码,并举例演示算法的执行过程。 算

    2023年04月24日
    浏览(41)
  • 二叉树的遍历的递归与非递归算法

    按照一定规律对二叉树的 每个结点进行访问且 仅访问一次 ; 这里的访问:可以是计算二叉树中的结点数据,打印该结点的信息,也可以是对结点进行的任何其它操作! 为什么需要遍历二叉树? 从过遍历可以得到访问结点的顺序序列,遍历操作就是将二叉树的结点按一定的

    2024年04月15日
    浏览(36)
  • 【递归】【后续遍历】【迭代】【队列】Leetcode 101 对称二叉树

    ---------------🎈🎈对称二叉树 题目链接🎈🎈------------------- 时间复杂度O(N) 空间复杂度O(N)

    2024年02月19日
    浏览(39)
  • 二叉树的遍历(先序遍历,中序遍历,后序遍历)递归与非递归算法

    先序遍历:先遍历一颗树的根节点,后遍历左子树,最后遍历右子树     先序遍历序列: 1 - 2 - 4 - 5 - 3 - 6 - 7 分解子问题方法 思路:将一颗二叉树看做两个部分,一个部分是左路节点,另一个部分是左路节点的右子树,先将二叉树的左路节点全部入栈,再依次出栈,出栈的

    2024年02月14日
    浏览(38)
  • 二叉树的最大深度和最小深度(两种方法:递归+迭代)

    二叉树的最大深度:   二叉树的最小深度: 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点的节点。  输入:root = [3,9,20,null,null,15,7] 输出:2  

    2024年02月15日
    浏览(37)
  • 二叉树的前序、中序、后序遍历(递归版)

      二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。 1、二叉树的遍历方法 对于二叉树,有深度遍历和广度遍历,深度遍历有前序、中序以及后序三种遍历方法,广度遍历即我们平常所说的层次遍历。 因为树的定义本身就是递归定义,

    2024年02月10日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包