数据结构OJ题——二叉树前序、中序遍历非递归实现(Java版)

news2024/9/23 15:23:50

二叉树前序、中序遍历非递归实现

  • 前序非递归遍历实现
  • 中序非递归遍历实现

前序非递归遍历实现

题目: 二叉树前序遍历非递归实现
总体思路:用非递归的方式模拟递归遍历。
以下图为例:
在这里插入图片描述
图示详解:
在这里插入图片描述
代码实现:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        TreeNode cur = root;
        Stack<TreeNode> stack = new Stack<>();
        while(cur != null || stack.isEmpty() == false){//这个循环条件很难想到
            while(cur != null){
                stack.push(cur);
                list.add(cur.val);
                cur = cur.left;
            }
            //此时节点为空
            TreeNode top = stack.pop();
            cur = top.right;
        }
        return list;
    }
}

中序非递归遍历实现

题目: 二叉树中序遍历非递归实现
思路:中序非递归遍历和前序非递归遍历总体思路相同,唯一一个区别点是如果cur节点非空时,只压栈,list中并不立即记录当前cur的val值,同时令cur = cur.left。当cur == null时,栈顶元素出栈,此时在list中记录。如下以一组图示进行形象说明。
在这里插入图片描述
中序遍历和前序遍历代码处的不同只有一处,如下:
在这里插入图片描述
中序遍历非递归完整代码:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<Integer> inorderTraversal(TreeNode root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        TreeNode cur = root;
        Stack<TreeNode> stack = new Stack<>();
        while(cur != null || stack.isEmpty() == false){//这个循环条件很难想到
            while(cur != null){
                stack.push(cur);               
                cur = cur.left;
            }
            TreeNode top = stack.pop();
            list.add(top.val);
            cur = top.right;
        }
        return list;
    }
}

总结:前序、中序非递归遍历,两者只是在节点的记录时机不同,而节点的遍历路径完全相同。这也从根本上导致了两道题的AC代码几乎相同。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1409293.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【4.LCD显示】蓝桥杯嵌入式一周拿奖速成系列

系列文章目录 蓝桥杯嵌入式系列文章目录(更多此系列文章可见) 文章目录 系列文章目录LCD显示一、官方例程讲解二、main.c --> LcdProcess总结 LCD显示 因为官方给了我们LCD的例程,所以很easy,我们照着套就行 LcdProcess() 一、官方例程讲解 二、main.c --> LcdProcess…

143基于matlab的2D平面桁架有限元分析

基于matlab的2D平面桁架有限元分析&#xff0c;可以改变材料参数&#xff0c;输出平面结构外形&#xff0c;各桁架应力&#xff0c;位移及作用力。可查看节点力&#xff0c;程序已调通&#xff0c;可直接运行。 143 matlab 平面桁架 有限元分析 桁架应力 (xiaohongshu.com)

ubuntu下docker卸载和重新安装

卸载&#xff1a;步骤一&#xff1a;停止Docker服务 首先&#xff0c;我们需要停止正在运行的Docker服务。打开终端&#xff0c;执行以下命令&#xff1a; sudo systemctl stop docker 步骤二&#xff1a;删除Docker安装包 接下来&#xff0c;我们需要删除已经安装的Docker软件…

《WebKit 技术内幕》学习之六(3): CSS解释器和样式布局

3 WebKit布局 3.1 基础 当WebKit创建RenderObject对象之后&#xff0c;每个对象是不知道自己的位置、大小等信息的&#xff0c;WebKit根据框模型来计算它们的位置、大小等信息的过程称为布局计算&#xff08;或者称为排版&#xff09;。 图描述了这一过程中涉及的主要WebKit…

全球机器人产业:技术创新驱动下的市场与竞争新态势

原创 | 文 BFT机器人 近年来&#xff0c;随着颠覆性技术创新的不断涌现、市场新需求的迅速崛起以及外部冲击的深远影响&#xff0c;机器人产业正经历着前所未有的变革。在技术领域&#xff0c;机器人技术不断突破&#xff0c;智能化、自主化、协同化水平日益提升&#xff1b;在…

防火墙综合拓扑接口配置

目录 1、先给Server1、Server2&#xff0c;PC1、Client1、Client2、PC2配置IP、掩码、 网关。 2、LSW1 3、Cloud1 4、FW2 5、 Web界面配置防火墙 6、测试 1、先给Server1、Server2&#xff0c;PC1、Client1、Client2、PC2配置IP、掩码、 网关。 2、LSW1 [Huawei]int g …

明天见!跨越“白酒+文旅+文创”赛道,密鉴品牌将大幅焕新

执笔 | 洪大大 编辑 | 扬 灵 过去的2023年&#xff0c;外部环境的变化叠加产业周期的调整&#xff0c;使得行业呈现出更强的挤压态势&#xff0c;在此背景下&#xff0c;白酒品牌期望对各方资源进行高效整合与充分联动&#xff0c;以此来应对行业周期调整并适应产业升级步伐…

松散子序列(第十四届蓝桥杯省赛PythonB组)

给定一个仅含小写字母的字符串 s&#xff0c;假设 s 的一个子序列 t 的第 i 个字符对应了原字符串中的第 pi 个字符。 我们定义 s 的一个松散子序列为&#xff1a;对于 i>1 总是有 pi−pi−1≥2。 设一个子序列的价值为其包含的每个字符的价值之和&#xff08;a∼z 分别为…

【江科大】STM32:I2C通信外设(硬件)

在将2C通信外设之前&#xff0c;我们先捋一捋&#xff0c;串口的相关特点来和I2C进行一个对北比。 首先&#xff1a; 1,大部分单片机&#xff0c;设计的PCB板均带有串口通信的引脚&#xff08;也就是通信基本都借助硬件收发器来实现&#xff09; 2.对于串口的异步时序&#xff…

Hudi学习笔记(一)

大数据发展背景 Hudi用于管理分布式文件系统上大型分析数据集存储&#xff0c;支持Spark和Flink整合。它能够是DFS数据集在分钟级时延内支持变更&#xff0c;也支持下游系统对这个数据集的增量处理。 学习目标 什么是数据湖为什么使用数据湖Hudi基本功能如何编译Hudi源码Hud…

4 课程分类查询

4 课程分类查询 4.1 需求分析 下边根据内容管理模块的业务流程&#xff0c;下一步要实现新增课程&#xff0c;在新增课程界面&#xff0c;有三处信息需要选择&#xff0c;如下图&#xff1a; 课程等级、课程类型来源于数据字典表&#xff0c;此部分的信息前端已从系统管理服…

SpringMVC第四天(SSM整合)

SSM整合流程 1.创建工程 2.SSM整合 ①Spring SpringConfig package com.cacb.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import;…

opencv#34 边缘检测(二)

Laplacian(拉普拉斯)算子 前面介绍的Sobel算子和Scharr算子存在的问题: 1.要分别计算两个方向&#xff08;x,y)的边缘&#xff0c;之后将两方向的边缘进行叠加。 2.边缘与方向相关性较大。当我们通过Sobel算子提取x方向检测时&#xff0c;它所能够检测到的边缘都是一个沿着y…

如何在转接的NVME 固态盘上安装WIN 系统并引导启动

问题&#xff1a; 家里的台式机一直挂着一块128G的SSD固态盘&#xff0c;由于家里自己建了NAS存储&#xff0c;所以基本数据都在NAS里&#xff0c;台式机就没有挂机械盘了&#xff0c;但是最近台式机空间被系统侵蚀&#xff0c;显然就不够用了&#xff0c;除了清理系统&#xf…

八数码(BFS + 队列 + 哈希表)

这题虽然比较难&#xff0c;但仍然遵循BFS的思路图片引自我的上一篇文章&#xff1a; 走迷宫&#xff08;BFS 队列&#xff09;-CSDN博客 难点 &#xff08;1&#xff09;如何将一个二维数组表示的状态记录下来&#xff0c;并且需要便于知道某个状态是否访问过 &#xff0…

Biotin-PEG4-TSA,生物素-PEG4-酪胺,用于标记蛋白质、核酸等生物分子

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Biotin-PEG4-Tyramide&#xff0c;Biotin-PEG4-TSA&#xff0c;生物素-PEG4-酪胺&#xff0c;Biotin PEG4 Tyramide&#xff0c;Biotin PEG4 TSA 一、基本信息 产品简介&#xff1a;Biotin PEG4 Tyramide is compos…

CSS 楼梯弹弹球

<template><view class="loader"></view> </template><script></script><style>body {background-color: #212121;/* 设置背景颜色为 #212121 */}.loader {position: relative;/* 设置定位为相对定位 */width: 120px;/* 设…

杰卡德距离(Jaccard Distance)

杰卡德距离&#xff08;Jaccard Distance&#xff09;&#xff0c;是用于衡量两个集合差异性的一种指标&#xff0c;它是杰卡德相似系数的补集&#xff0c;可以用来区分集合&#xff08;如知识图谱&#xff09;。 杰卡德相似系数 杰卡德相似系数&#xff08;Jaccard similari…

《Linux高性能服务器编程》笔记07

Linux高性能服务器编程 本文是读书笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第14章 多线程编程14.1 Linux线程概述14…

【计算机网络】协议,电路交换,分组交换

定义了在两个或多个通信实体之间交换的报文格式和次序,以及报文发送和/或接收一个报文或其他事件所采取的动作.网络边缘: 端系统 (因为处在因特网的边缘) 主机 端系统 客户 client服务器 server今天大部分服务器都属于大型数据中心(data center)接入网(access network) 指将端…