首页 > 编程语言 > 数据结构之二叉树的遍历3(java)

数据结构之二叉树的遍历3(java)

时间:2023-11-21 15:05:24浏览次数:32  
标签:遍历 出栈 java 孩子 二叉树 treeNode 节点

一:概述

绝大多数的可以用递归解决问题,也可以使用另一种数据结构来解决,这种数据结构就是。因为递归和栈都有回溯的特性。

二:具体说明

如何借助栈来实现二叉树的遍历,下面以二叉树的前序遍历为例,来阐述具体过程。

<1>首先遍历二叉树的根节点1,放入栈中。

                  数据结构之二叉树的遍历3(java)_前序遍历

<2>遍历根节点1的左孩子节点2,放入栈中。

                  数据结构之二叉树的遍历3(java)_前序遍历_02

<3>遍历节点2的左孩子节点4,放入栈中。

                  数据结构之二叉树的遍历3(java)_前序遍历_03

<4>节点4既没有左孩子,也没有右孩子,我们需要回溯到上一个节点2.如果不是做递归操作,怎么回溯呢?

栈可以存储刚才遍历的路径。让旧的栈顶元素4出栈,就可以重新访问节点2,得到节点2的右孩子5.

此时节点2已经没有了利用价值(已经访问过左孩子和右孩子),节点2出栈,节点5入栈。

                  数据结构之二叉树的遍历3(java)_出栈_04

<5>节点5既没有左孩子,也没有右孩子,我i们需要再次回溯,一直回溯到节点1.所以让节点5出栈。根节点1的右孩子是节点3,节点1出栈,节点3入栈。

                  数据结构之二叉树的遍历3(java)_入栈_05

<6>节点的右孩子是节点6,节点3出栈,节点6入栈。

                  数据结构之二叉树的遍历3(java)_出栈_06

<7>节点6既没有左孩子,也没有右孩子,所以节点6出栈。此时栈为空,遍历结束。

                  数据结构之二叉树的遍历3(java)_出栈_07

具体前序遍历代码:

 /**
     * 二叉树非递归前序遍历
     * @param root
     */
    public static void preOrderTraveralWithStack(TreeNode root) {
        Stack<TreeNode> stack = new Stack<TreeNode>();
        TreeNode treeNode = root;
        while(treeNode != null || !stack.isEmpty()) {
            //迭代访问节点的左孩子,并入栈
            while (treeNode != null) {
                System.out.println(treeNode.data);
                stack.push(treeNode);
                treeNode = treeNode.leftChild;
            }
            // 如果节点没有左孩子,则弹出栈顶节点,访问节点右孩子
            if(!stack.isEmpty()) {
                treeNode = stack.pop();
                treeNode = treeNode.rightChild;
            }
        }
    }

二叉树的中序遍历和后序遍历的非递归实现,思路和前序遍历差不多,都是利用栈的回溯。

标签:遍历,出栈,java,孩子,二叉树,treeNode,节点
From: https://blog.51cto.com/u_15912723/8501969

相关文章

  • Linux部署Java环境
    本文使用的Linux发行版本为AlmaLinux9.264位(CentOS停止更新后的完美替代发行版本)。本文安装的JDK版本为21.0.1,其他版本方法类似。下载并安装Java开发工具包(JavaDevelopmentKit)更新系统。dnf-yupdate获取安装包链接。前往JDK下载官网。找到对应Linux版本的压缩......
  • java finally一定会执行吗?
    1.答案是不一定,而且很容易弄出不执行的情况;最简单的:在IDEA上执行:try{log("aaa");Thread.sleep(10000);log("bbbb");}catch(Exceptione){log("ddd");}finally{log("eee");}在打印了aaa后点击红色方框停止按钮,会发现应用就停止了,然后没有继续打......
  • 遍历循环,只要有其中一个符合就退出
    使用stream流的anyMatch判断的条件里,任意一个元素成功,返回true上代码List<SectorInfo>sectorsInfo=scanResultParser.apply(scanResult);returnsectorsInfo.stream().map(sectorInfo->badSectorCountParser.apply(sectorInfo.getValue()))......
  • Java开发常见问题分析
    程序Bug的产生,通常分为三种类型逻辑漏洞:低级错误,程序执行后无法达到想要效果。越界访问:访问了非法区域,造成程序崩溃。条件考虑不全面:你以为你万无一失,但你永远都不知道输入参数究竟是什么!如何防范未知Bug:异常捕获异常捕获一般依靠try,catch语句。很好理解:try(尝试)一......
  • Java -day4
    4.7稀疏数组publicstaticvoidmain(String[]args){int[][]array1=newint[11][11];array1[1][2]=1;array1[2][3]=2;System.out.println("原始数组");for(int[]ints:array1){for(intanInt......
  • 使用Java与MySQL开发计算器
    [实验目的]1.掌握软件开发的基本流程2.掌握常用的软件开发方式和工具。[实验内容]设计一个包含登录界面的计算器软件,该软件可以实现第一次作业中的全部功能,同时可以保存用户的历史计算记录(保存数据最好使用数据库)。[实验环境及开发工具]使用MicrosoftVisio作绘图工具使用......
  • 《最新出炉》系列初窥篇-Python+Playwright自动化测试-31-JavaScript的调用执行-上篇
    1.简介在做web自动化时,有些情况playwright的api无法完成以及无法应对,需要通过或者借助第三方手段比如js来完成实现,比如:去改变某些元素对象的属性或者进行一些特殊的操作,本文讲解playwright怎样来调用JavaScript完成特殊操作。2.用法上一篇中就提到过,这里提取一下,语法如下:......
  • Java中的位运算符介绍
    一、Java中的位运算符Java提供了6种基本的位运算符,它们用于直接操作二进制数位,分别是:位与运算符(&)作用:对两个数的每一位执行与操作,只有在对应位都为1时结果才为1。示例:1intresult=5&3;//Result:1(0b0101&0b0011)位或运算符(|)作用:对两个数的每一......
  • 用java框架spring boot写一个文件上传
    在SpringBoot中,实现文件上传可以使用SpringFramework提供的MultipartResolver。以下是一个简单的SpringBoot文件上传示例:在POM文件中添加以下依赖:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></depend......
  • JAVA之List过滤
    List过滤的三种方式:通过java8中filter过滤器进行过滤通过For循环遍历过滤通过ForEach遍历过滤publicclassFilteringList{/***通过java8中filter过滤器进行过滤*@paramuserList*@return*/publicList<User>filterByStream(List......