二叉树的递归遍历、非递归遍历、层次遍历

2023-11-19

1.递归遍历

2.非递归遍历

3.层次遍历


1.递归遍历

  • 在使用递归遍历的时候,每个节点会经过三次.
public class PreInPosTraversal {

	public static class Node {
		public int value;
		public Node left;
		public Node right;

		public Node(int data) {
			this.value = data;
		}
	}

    // 前序遍历
	public static void preOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		System.out.print(head.value + " ");
		preOrderRecur(head.left);
		preOrderRecur(head.right);
	}

    // 中序遍历
	public static void inOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		inOrderRecur(head.left);
		System.out.print(head.value + " ");
		inOrderRecur(head.right);
	}

    // 后序遍历
	public static void posOrderRecur(Node head) {
		if (head == null) {
			return;
		}
		posOrderRecur(head.left);
		posOrderRecur(head.right);
		System.out.print(head.value + " ");
	}
}

2.非递归遍历

  • 非递归一般只会经过每个节点两次
// 前序非递归(中左右),使用一个栈。先压右节点,再压左节点。
public static void preOrderUnRecur(Node head) {
		System.out.print("pre-order: ");
		if(root==null) return;
        Stack<TreeNode> s=new Stack<>();
        while (!s.isEmpty()||root!=null){
            while(root!=null){
                System.out.print(root.val+" ");
                s.push(root);
                root=root.left;
            }
            if(!s.isEmpty()){
                TreeNode t=s.pop();
                root=t.right;
            }
        }
	}

// 中序非递归(左中右),使用一个栈。
// 若节点非空,一路向左下压栈,若节点空,则弹出打印并将右节点压栈继续循环。
public static void inOrderUnRecur(Node head) {
		System.out.print("in-order: ");
		if(root==null) return;
        Stack<TreeNode> s=new Stack<>();
        while (!s.isEmpty()||root!=null){
            while(root!=null){
                s.push(root);
                root=root.left;
            }
            if(!s.isEmpty()){
                TreeNode t = s.pop();
                System.out.print(t.val+" ");
                root=t.right;
            }
        }
	}

// 后续非递归(左右中)。可以使用微调后的前序遍历作为辅助,得到(中右左),循环过程中压栈最后弹出就可以得到(左右中)。
public static void posOrderUnRecur1(Node head) {
		System.out.print("pos-order: ");
		if (head != null) {
			Stack<Node> s1 = new Stack<Node>();
			Stack<Node> s2 = new Stack<Node>();
			s1.push(head);
			while (!s1.isEmpty()) {
				head = s1.pop();
				s2.push(head);
				if (head.left != null) {
					s1.push(head.left);
				}
				if (head.right != null) {
					s1.push(head.right);
				}
			}
			while (!s2.isEmpty()) {
				System.out.print(s2.pop().value + " ");
			}
		}
	}

3.层次遍历

// 层次遍历,用队列保存每个节点的左右子节点。
public static void level (Node node) {
        if (node == null) {
            return;
        }
        List<Node> list = new ArrayList<Node>();
        list.add(node);
        while (!list.isEmpty()) {
            Node temp = list.remove(0);
            System.out.println(temp.value);
            if (temp.left !=  null) {
                list.add(temp.left);
            }
            if (temp.right != null) {
                list.add(temp.right);
            }
        }
    }

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

二叉树的递归遍历、非递归遍历、层次遍历 的相关文章

  • 数据结构——二叉树 增加、删除、查询

    二叉树系统 public class BinarySystem public static void main String args BinaryDomain root null 定义头结点 new BinaryAction manage
  • 树(Tree)——(六)平衡搜索二叉树理论篇

    目录 平衡 分类 最小不平衡子树 AVL Tree AVL树的失衡调整的四种情况 1 左单旋 RR 关键代码 例 补充 2 右单旋 LL 关键代码 3 右左双旋 RL 4 左右双旋 LR 总结 平衡 影响树的平衡的因素主要有 插入顺序 删除
  • 为什么我们要考虑线性规划的对偶问题?

    文章转自 https www zhihu com question 26658861 版权归原作者
  • 数据结构--二叉树进阶

    因为我们之前在学习数据结构的时候使用的是C语言 但是并不是所有的数据结构都适合使用C语言学习 如今我们了解了C 的基础语法 具备了学习这些稍微难一点的数据结构的前提 所以我们再次回顾数据结构 使用C 这一更加先进的武器 来解决更加复杂的问题
  • 数据结构-二叉树-更新完整版

    目录 二叉树初识 实现二叉树的功能 功能前操作 遍历功能 操作 计算 查询功能 源码 因为上次二叉树的文章的功能不全 所以这次更新一个完整版的二叉树文章 这篇文章有些功能是需要用到队列知识的 所以对队列不了解的可以先去看看这篇队列 详解 因
  • 输出具有n个结点的所有不同的二叉树-增强前序遍历形式输出-C++

    我们知道具有n个结点的不同的二叉树的数量是个 这是一个卡塔兰数 那么如何确定这些二叉树是什么样子的呢 下面是博主的思路 我们还知道一个入栈序列的不同出栈序列的数量也是个 于是博主就想 这不是巧了么 既然他们的数量是一样的 而且均不相同 那么
  • JavaScript数据结构-树

    文章转自 JavaScript数据结构 树 我觉得这社会上 也不差钱好多人 可能好多人也不差权力 但是我觉得能得到这种满足的也不多 郭小平 lt 临汾红丝带学校校长 gt 树是计算机科学中经常用到的一种数据结构 树是一种非线性的数据结构 以
  • 二叉树的基本概念及性质

    文章目录 一 基本概念 二 二叉树的种类 二叉树 满二叉树 完全二叉树 二叉搜索树 平衡二叉搜索树 三 二叉树的性质 性质一 性质二 性质三 性质四 性质五 一 基本概念 树是 n 个结点的有限集 在任意一颗非空树中 1 有且仅有一个特定的
  • 剑指 Offer 28. 对称的二叉树 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 28 对称的二叉树 1 递归解法 对称二叉树定义 对于树中 任意两个对称节点 L L L 和 R R R 一定有
  • 线索二叉树(中序、先序和后序及遍历)

    链式存储 线索二叉树是二叉树的一类 在看线索二叉树之前我们先看一下二叉树的链式存储 一个二叉树的存储例子 后面用到的二叉树都是这棵 代码是这样的 public class BinaryTreeNode
  • C语言二叉树的基本操作(超全)

    二叉树作为数据结构其实是一个挺有意思的结构 可以有多种应用 我们直接来看一下二叉树的代码 include
  • java判断是否为序列二叉树 - Kaiqisan

    大家好 都吃晚饭了吗 我是Kaiqisan 是一个已经走出社恐的一般生徒 今天还是二叉树诶嘿嘿 首先还是明确一个概念 何为序列二叉树 答 中序遍历之后序列递增的二叉树为序列二叉树 比如这棵树 4 2 7 1 3 5 8 6 它的中序遍历结果
  • 二叉树——初识

    链表 gt 二叉树 gt 二叉查找树 gt 平衡二叉树 二叉树时间复杂度 O logn 即2 x 树的深度 N 如 21亿点需要查找几次 2 32 21亿 查找32次 1 满二叉树 2 完全二叉树 设二叉树的深度为h 除第 h 层外 其它各
  • 面试经典(16)--二叉树根节点到指定节点的路径

    题目描述 给定一棵二叉树和二叉树中一个节点 输出根节点到指定节点间的路径 10 5 12 4 7 指定节点7 那么输出路径应该是10 5 7 分析与解法 这个题目是在我做过蛮多二叉树的题目之后总结的一道题目 发现很多题目都可以抽象出来这个题
  • 【数据结构】&&【C++】平衡搜索二叉树的模拟实现(AVL树)

    数据结构 C 平衡搜索二叉树的模拟实现 AVL树 一 AVL树的性质 二 AVL树的模拟实现 AVL树结点的定义 AVL树的插入 平衡因子的更新 左单旋 右单旋 双旋 左右旋 右左旋 AVL树的删除 检查是否是AVL树 三 完整代码 一 A
  • LeetCode 687. 最长同值路径

    题目链接 https leetcode cn problems longest univalue path C 代码如下 Definition for a binary tree node struct TreeNode int val T
  • 【数据结构】树与二叉树

    文章目录 树型结构 什么是树型结构 树型结构的概念 树的表示形式 树的应用 二叉树 二叉树的概念 两种特殊的二叉树 二叉树的性质 二叉树性质练习 练习一 解析 练习二 解析 练习三 解析 练习四 解析 总结 树型结构 什么是树型结构 树是一
  • python二叉树类定义,列表转二叉树,leetcode本地调试

    如果想用本地IDE调试leetcode上的题目 可以使用以下辅助类 二叉树类定义 Definition for a binary tree node class TreeNode def init self x self val x sel
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • [共同学习] 平衡二叉树浅见

    平衡二叉树 平衡二叉树的概念 AVL树结点的定义 AVL树的插入 左左 右单旋 右右 左单旋 左右 先左旋 再右旋 右左 先右旋 再左旋 AVL树的验证 验证其为二叉搜索树 验证其为平衡树 AVL树的性能 AVL树的实现 感悟 以上 二叉搜

随机推荐

  • VUEX各个模块的封装以及Router封装

    一 各个模块的作用 state 用来数据共享数据存储 mutation 用来注册改变数据状态 同步 getters 用来对共享数据进行过滤并计数操作 action 解决异步改变共享数据 异步 二 创建文件 actions js getter
  • 5种常见函数的写法和调用方式

    前言 函数在开发中随处可见 经常在开发中我们声明函数就使用了一两种就已经足够了 但是 对我这有梦想的码农来说 这显然是不够的 因此 总结整理了5中常见的声明方式和调用方式 1 函数声明 最常规写法 常规函数写法 function bar c
  • Request processing failed;nested exception is java.lang.*

    目录 问题 分析 解决 附录 注意 参考 问题 错误1 httpClient向服务端发送请求 服务端有时候就会给客户端返回 500错误 打开服务端错误日志 报如下错误 2021 05 28 21 05 06 548 default http
  • 面试官让我讲讲分布式系统容错架构,结果。。。

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 TB级数据放在一台机器上 难啊 到底啥是分布式存储 啥又是分布式存储系统 某台机器宕机了咋办 Master节点如何感知到数据副本消失 如何复制副本保持足够副本数
  • 遥感新赛事!变化检测、图像融合等比赛全面启动!2023"国丰东方慧眼杯"遥感影像智能处理算法大赛来了!...

    点击下方卡片 关注 CVer 公众号 AI CV重磅干货 第一时间送达 2023 国丰东方慧眼杯 遥感影像智能处理算法大赛火热进行中 遥感影像智能处理算法大赛是国家自然科学基金委信息科学部 空间信息网络基础理论与关键技术 重大研究计划指导专
  • 剑指 Offer 14- I. 剪绳子(343. 整数拆分)&& 剑指 Offer 14- II. 剪绳子 II —思路和心得

    剑指 Offer 14 I 剪绳子 和剪绳子1相同的题 思路 利用动态规划 因为每个长度大于3的绳子的最大值都可以划分为2和3的乘积 我们想将长度为 2 3的绳子的最大值先算出来 然后再利用动态规划 进步算出长度为n的绳子的最大值 clas
  • 国内比较好的软件接单平台有哪些?

    随着企业信息化水平的提高 已经有很多企业意识到了使用专用软件可以大大提高资金使用率 提高员工的工作效率 降低成本 同现有业务接轨 即软件设计思路和方法的一般过程 包括设计软件的功能和实现的算法和方法 软件的总体结构设计和模块设计 编程和调试
  • git安装配置

    安装 当前ubuntu镜像中已经安装好了git 以下步骤可以跳过 安装 sudo apt get install git 安装成功后 运行如下命令 git 配置 在ubuntu的命令行中 修改某台机器的git配置 修改为注册github时的
  • sentinel3数据批量下载——sentinelsat

    本文主要记录利用sentinelsat包批量下载sentinel2数据 转载 https blog csdn net mrzhy1 article details 107044828 方法一 直接利用sentinelsat包 1 senti
  • 什么是单向数据流

    当父组件给子组件传递数据的时候 子组件只允许进行数据的读操作 不允许做数据的改操作 因为当子组件改变父组件传递过来的数据的话会造成数据流难以理解 简单分析一下 当子组件中更改了父级的内容时 其他需要引用父级组件也会被更改 从而导致父级组件在
  • python怎么算积分_python计算积分

    python有多个方法计算积分 下面介绍其中三个 以下式为例 方法一 直接用numpy计算 start 1 stop 2 length 101 x np linspace start stop length y x 2 result sum
  • Kotlin+Compose+MVVM模式(井字棋)

    井字棋 简单的演示一下MVVM模式结合Compose的运用 Compose 组合 1 Model 2 View activity fragment composable 3 ViewModel livedata gt stateOf 声明式
  • Qt框架及模块认识

    小白自工作就接触Qt 一直都在使用Qt5 3 1版本 所以没有经历过大牛们把项目从Qt4程序到Qt5的烦恼 没准以后会碰到 对Qt所有的丰富的API表示惊叹 对于Qt的框架及模块认识也是极为模糊的 文中有不对之处希望大牛们打脸 虽然脸都已经
  • AFX_MANAGE_STATE(AfxGetStaticModuleState())的使用

    MSDN By default MFC uses the resource handle of the main application to load the resource template If you have an export
  • jsp上显示JFreeChart生成的饼状图

    文件配置
  • UE4(Unreal Engine4)在蒙太奇动画中添加音频轨道通知

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 遇到的问题 二 操作步骤 前言 UE4 Unreal Engine4 在蒙太奇动画中添加音频轨道通知 我们想在某一帧动画中添加声音 比如我们想在动画的第13帧这里添加音效 一 遇到
  • 对于单向链表的排序与去重

    include bits stdc h using namespace std struct node int num node next class Chain public Chain head tail new node void G
  • 【计算机科学】【2017】变分推理与深度学习

    本文为荷兰阿姆斯特丹大学 作者 Kingma D P 的博士论文 共174页 在本文中 我们提出了变分 贝叶斯 推理 生成建模 表示学习 半监督学习和随机优化问题的新的解决方案 我们提出了一种有效的变分推理算法 Kingmaand Well
  • 解析目标检测全流程!附代码数据

    关注后 星标 Datawhale 每日干货 每月组队学习 不错过 Datawhale干货 作者 王程伟 算法工程师 Datawhale成员 在计算机视觉中 红外弱小目标检测是一个重要的方向 但直到近一两年 才开始运用一些深度学习的方法 深度
  • 二叉树的递归遍历、非递归遍历、层次遍历

    1 递归遍历 2 非递归遍历 3 层次遍历 1 递归遍历 在使用递归遍历的时候 每个节点会经过三次 public class PreInPosTraversal public static class Node public int val