如何进行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)

相关推荐

  • mysql数据库误删除后怎么办

    技术mysql数据库误删除后怎么办小编给大家分享一下mysql数据库误删除后怎么办,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!首先,要确保mysql开启了binlog日志功能在/etc/my.cnf文

    攻略 2021年11月2日
  • nodejs用哪些调试工具

    技术nodejs用哪些调试工具这篇文章将为大家详细讲解有关nodejs用哪些调试工具,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 调试node的工具:1、

    攻略 2021年11月7日
  • Android studio有哪些使用小技巧

    技术Android studio有哪些使用小技巧这篇文章主要介绍“Android studio有哪些使用小技巧”,在日常操作中,相信很多人在Android studio有哪些使用小技巧问题上存在疑惑,小编查阅了各式资料,

    攻略 2021年11月13日
  • SpringCloud (一) Eureka

    技术SpringCloud (一) Eureka SpringCloud (一) EurekaEurekaEureka 是一个服务治理组件,它主要包括服务注册和服务发现,主要用来搭建服务注册中心。
    Eu

    礼包 2021年12月23日
  • 6.函数

    技术6.函数 6.函数1.函数介绍
    函数的英文叫做 : function , 而function的解释项中有另外一个含义”功能 ”, 函数就是功能 , 调用一个函数就是
    在调用一个功能。
    你可以理解成一

    礼包 2021年12月23日
  • GO中range怎么用

    技术GO中range怎么用这篇文章给大家分享的是有关GO中range怎么用的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。GO 语言的 for…range 能做什么呢?golang 的 for

    攻略 2021年10月31日