Java 数据结构中二叉树前中后序遍历非递归的具体实现详解

作者:dhdhdhdhg 时间:2023-02-14 12:51:18 

一、前序遍历

1.题目描述

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

2.输入输出示例

示例 1:

Java 数据结构中二叉树前中后序遍历非递归的具体实现详解

输入:root = [1,null,2,3]

输出:[1,2,3]

示例2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

3.解题思路

前序遍历:根结点—左子树—右子树

Java 数据结构中二叉树前中后序遍历非递归的具体实现详解

1.判断额外情况,如果树为空,直接返回
2.创建一个栈用来保存右子树
3.先将根结点入栈,避免多次判断栈为空
4.取出栈顶元素(第一次为根结点),从上往下遍历最左侧路径中的每个结点
5.在遍历时判断当前结点的右子树是否为空,非空则入栈
6.遍历结束后,此时栈顶元素为前一个结点的右子树,将栈顶元素取出,将其看作一棵树,继续重复上述操作,即形成循环。

4.代码实现


class Solution {
   public List<Integer> preorderTraversal(TreeNode root) {
       List<Integer> list=new ArrayList<>();
       if(root==null){
           return list;
       }

//创建一个栈用来保存右子树
       Stack<TreeNode> s=new Stack<>();
       TreeNode cur=root;
       s.push(root);
       //从上往下遍历最左侧路径中的每个结点,并将其右子树保存起来---栈
       while(!s.empty()||cur!=null){
           cur=s.pop();
           while(cur!=null){
               list.add(cur.val);
               if(cur.right!=null){
                   s.push(cur.right);
               }
               cur=cur.left;
           }
       }
       return list;
   }
}

二、中序遍历

1.题目描述

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

2.输入输出示例

示例 1:

Java 数据结构中二叉树前中后序遍历非递归的具体实现详解

输入:root = [1,null,2,3]

输出:[1,3,2]

示例 2:

输入:root = []

输出:[]

示例 3:

输入:root = [1]

输出:[1]

3.解题思路

中序遍历:左子树—根结点—右子树

Java 数据结构中二叉树前中后序遍历非递归的具体实现详解

1.判断额外情况,如果树为空,直接返回
2.创建一个栈用来保存结点
3.从上往下遍历最左侧路径中的每个结点,并将其保存到栈中,走到cur==null的位置
4.此时栈顶元素为最左侧路径的最后一个结点,将其加入到list并将栈顶元素移除
5.判断最后一个结点的右子树是否为空,过程和上述的过程是一样的,直接将其右子树看作一棵树,整个过程便循环起来

4.代码实现


class Solution {
   public List<Integer> inorderTraversal(TreeNode root) {
       List<Integer> list=new ArrayList<>();
       if(root==null){
           return list;
       }
       Stack<TreeNode> s=new Stack<>();
       TreeNode cur=root;
        //从上往下遍历最左侧路径中的每个结点,并将其保存到栈中
       while(!s.empty()||cur!=null){
           while(cur!=null){
               s.push(cur);
               cur=cur.left;
           }
           cur=s.pop();
           list.add(cur.val);
           cur=cur.right;
       }
       return list;
   }
}

三、后序遍历

1.题目描述

给定一个二叉树,返回它的 后序 遍历。

2.输入输出示例

示例:
输入: [1,null,2,3]
1
\
2
/
3

输出: [3,2,1]

3.解题思路

后序遍历:左子树—右子树—根结点

Java 数据结构中二叉树前中后序遍历非递归的具体实现详解

1.判断额外情况,如果树为空,直接返回
2.创建一个栈用来保存遍历的结点
3找出以cur为根的二叉树中最左侧的节点,并保存所经路径中的所有结点—栈
4.此时栈顶元素为最左侧路径的最后一个结点
5.先要判断最后一个结点的右子树是否为空

如果为空,直接将结点加入list,同时将栈顶元素删除
如果不为空则将右子树看作一棵树,重新进入循环判断

注意:如果按照这样,到了最后的右子树就会一直循环出不来
解决方案:
创建一个prev用来标记已经遍历过的结点,将能否编历的条件改为:top的右子树为空||top的右子树已经遍历过

4.代码实现


class Solution {
   public List<Integer> postorderTraversal(TreeNode root) {
       List<Integer> list=new ArrayList<>();
       if(root==null){
           return list;
       }
       Stack<TreeNode> s=new Stack<>();
       TreeNode cur=root;
       TreeNode prev=null;//用来标记刚刚遍历过的节点
       while(!s.empty()||cur!=null){
           //1.找出以cur为根的二叉树中最左侧的节点,并保存所经路径中的所有节点---栈
           while(cur!=null){
               s.push(cur);
               cur=cur.left;
           }
           TreeNode top=s.peek();
           //top能否遍历:top的右子树为空||top的右子树已经遍历过
           if(top.right==null||top.right==prev){
               list.add(top.val);
               prev=top;
               s.pop();
           }else{
               cur=top.right;
           }  
       }
       return list;
   }
}

来源:https://blog.csdn.net/m0_51405559/article/details/121201623

标签:Java,数据结构,二叉树,非递归
0
投稿

猜你喜欢

  • 基于synchronized修饰静态和非静态方法

    2021-10-30 06:58:03
  • SpringBoot如何使用applicationContext.xml配置文件

    2022-11-15 08:18:53
  • 深入理解C#中的枚举

    2022-06-03 02:58:34
  • spring cloud alibaba Nacos 注册中心搭建过程详解

    2022-07-08 17:38:01
  • Android studio编写简单的手电筒APP

    2023-11-29 18:43:01
  • Java中遍历ConcurrentHashMap的四种方式详解

    2023-11-17 08:54:41
  • Android USB转串口通信开发实例详解

    2022-01-05 15:28:17
  • Javaweb开发中通过Servlet生成验证码图片

    2022-06-23 06:33:34
  • java后台接受到图片后保存方法

    2023-06-03 09:23:04
  • 浅谈java中的重载和重写的区别

    2023-03-31 04:45:57
  • Spring MVC中自定义拦截器的实例讲解

    2023-12-19 05:09:04
  • C# winform实现右下角弹出窗口结果的方法

    2023-02-05 14:22:57
  • Android实现图片轮播效果

    2022-01-24 02:33:13
  • java 定时器线程池(ScheduledThreadPoolExecutor)的实现

    2023-03-31 20:52:10
  • 解决Mybatis 大数据量的批量insert问题

    2023-09-08 13:59:40
  • dubbo整合springboot新手入门教程详解

    2022-07-29 21:19:00
  • Android 使用 SharedPreferences 保存少量数据的实现代码

    2023-07-03 01:00:11
  • 深入理解C♯ 7.0中的Tuple特性

    2023-10-28 09:33:14
  • SpringBoot项目Jar包如何瘦身部署的实现

    2021-09-21 05:37:51
  • Android从0到完整项目(1)使用Android studio 创建项目详解

    2022-12-13 13:48:21
  • asp之家 软件编程 m.aspxhome.com