如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现

技术如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现本篇文章为大家展示了如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希

本文向您展示了如何在Java数据结构中实现二叉树的非递归遍历。内容简洁易懂,一定会让你大放异彩。希望通过这篇文章的详细介绍,你能有所收获。

00-101

一、前序遍历

给出了二叉树的根节点,并返回其节点值的前序遍历。

00-1010示例1:

如何进行Java  数据结构中二叉树前中后序遍历非递归的具体实现

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

输出:[1,2,3]

例2:

输入:root=[]

输出:[]

例3:

输入:root=[1]

输出:[1]

00-1010前序遍历:根节点-左子树-右子树

如何进行Java  数据结构中二叉树前中后序遍历非递归的具体实现

1.判断额外的情况,如果树是空的,直接返回。

2.创建一个堆栈来存储右子树。

3.先把根节点放入栈中,避免多次判断栈为空。

4.取出堆栈的顶部元素(第一次是根节点),从上到下遍历最左边路径中的每个节点。

5.遍历时,判断当前节点的右子树是否为空;如果不是,它将被放入堆栈。

6.遍历后,此时栈顶元素是上一个节点的右子树,取出栈顶元素,当作树,继续重复上述操作,即形成循环。

1.题目描述

类别解决方案{

publicatlistingerpreordertraverse(treenoderroot){ 0

listinterlist=new ArrayList();

if(root==null){ 0

returnlist

}

//创建一个堆栈来存储右子树。

StackTreeNodes=newStack();

TreeNodecur=root

s . push(root);

//从上到下遍历最左边路径中的每个节点,并保存其右子树堆栈

while(!s.empty()||cur!=null){ 0

cur=s . pop();

while(cur!=null){ 0

list . add(cur . val);

如果(正确!=null){ 0

(=NationalBureauofStandards)国家标准局

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

上述内容就是如何进行Java 数据结构中二叉树前中后序遍历非递归的具体实现,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/78652.html

(0)

相关推荐

  • 英语小品,介绍个好玩的英语小品剧本

    技术英语小品,介绍个好玩的英语小品剧本Three Little Pigs 三只小猪 Storyteller: There are three little pigs living with 讲故事者英语小品:三只小猪和

    生活 2021年10月23日
  • Hadoop、Lambda、kappa有什么用

    技术Hadoop、Lambda、kappa有什么用这篇文章主要介绍“Hadoop、Lambda、kappa有什么用”,在日常操作中,相信很多人在Hadoop、Lambda、kappa有什么用问题上存在疑惑,小编查阅了各式

    攻略 2021年12月9日
  • cpu为什么可以直接访问内存(cpu是如何访问内存的)

    技术CPU是如何访问内存的这期内容当中小编将会给大家带来有关CPU是如何访问内存的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。内存管理可以说是一个比较难学的模块,之所以比较难学。一是

    攻略 2021年12月21日
  • 怎么手动配置node_modules中的依赖包

    技术怎么手动配置node_modules中的依赖包本篇内容介绍了“怎么手动配置node_modules中的依赖包”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情

    攻略 2021年10月27日
  • Java循环和数组练习题有哪些

    技术Java循环和数组练习题有哪些这篇文章主要介绍“Java循环和数组练习题有哪些”,在日常操作中,相信很多人在Java循环和数组练习题有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”

    攻略 2021年11月21日
  • mysql数据库备份恢复且保留新数据(mysql数据库的备份还原是怎么做的)

    技术mysql数据库增量数据恢复的方法是什么本篇内容介绍了“mysql数据库增量数据恢复的方法是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大

    攻略 2021年12月21日