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

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(使用前将#替换为@)

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

  • 动态规划之在二叉树中使用DP

    二叉树染色 题目描述 文章目录 二叉树染色 题目描述 详细思路 个人走的弯路 可略 正确思路 代码实现 传送门 小扣有一个根结点为 root 的二叉树模型 初始所有结点均为白色 可以用蓝色染料给模型结点染色 模型的每个结点有一个 val 价
  • 树(Tree)——(六)平衡搜索二叉树理论篇

    目录 平衡 分类 最小不平衡子树 AVL Tree AVL树的失衡调整的四种情况 1 左单旋 RR 关键代码 例 补充 2 右单旋 LL 关键代码 3 右左双旋 RL 4 左右双旋 LR 总结 平衡 影响树的平衡的因素主要有 插入顺序 删除
  • 二叉搜索树-红黑树

    前面介绍了AVL树 虽然AVL树将二叉树的高度差保证在1 但是实现的太过复杂 因为要不断调整平衡因子 故而要来介绍另外一个用途比较广的结构 红黑树 红黑树 先来看来红黑树的特性 1 每个节点非红即黑 2 根节点为黑色 3 不能有连续的红节点
  • 617. 合并二叉树(c++)

    暴力解 当t1为空返回t2 当t2为空返回t1 当t1 t2都有值 new新节点为两个节点的和 新节点左子树为原始节点左子树合并 新节点右子树为原始节点右子树合并 Definition for a binary tree node stru
  • 拉格朗日乘子法和KKT条件

    拉格朗日乘子法 Lagrange Multiplier 和KKT Karush Kuhn Tucker 条件是求解约束优化问题的重要方法 在有等式约束时使用拉格朗日乘子法 在有不等约束时使用KKT条件 前提是 只有当目标函数为凸函数时 使用
  • 二叉树的性质

    二叉树的性质以及满二叉树 完全二叉树 性质一 在二叉树的第i层 最多有2的 i 1 次方个结点i gt 1 性质二 深度为k的二叉树上最多有含有2的k次方 1个结点 k gt 1 性质三 对于任何一个二叉树 若它含有n0个叶子结点 n2个度
  • 学习笔记-创建赫夫曼树

    赫夫曼树 给定 n 个权值作为 n 个叶子结点 构造一棵二叉树 若该树的带权路径长度 wpl 达到最小 称这样的二叉树为最优二叉树 也称为哈夫曼树 Huffman Tree 还有的书翻译为霍夫曼树 赫夫曼树是带权路径长度最短的树 权值较大的
  • 二叉链表之寻找两节点的最近公共祖先☆

    题目 p q分别为指向该二叉树中任意两个节点的指针 试编写算法ancestor root p q r 找到p q的最近公共祖先节点r 分析 上一道题其实可以给我们一些启示 就是我们可以将任意节点的祖先存起来 那这里我们也可以用两个栈 分别将
  • 二叉查找树(BST)的基本概念及常用操作

    二叉查找树 二叉查找树 Binary Search Tree 也称二叉搜索树 有序二叉树 ordered binary tree 排序二叉树 orted binary tree 是指一棵空树或者具有下列性质的二叉树 若任意节点的左子树不空
  • (Java)leetcode-236 Lowest Common Ancestor of a Binary Tree(二叉树的最近公共祖先)

    题目描述 给定一个二叉树 找到该树中两个指定节点的最近公共祖先 百度百科中最近公共祖先的定义为 对于有根树 T 的两个结点 p q 最近公共祖先表示为一个结点 x 满足 x 是 p q 的祖先且 x 的深度尽可能大 一个节点也可以是它自己的
  • 剑指 Offer 27. 二叉树的镜像 -- 递归

    0 题目描述 leetcode原题链接 剑指 Offer 27 二叉树的镜像 1 递归算法 根据二叉树镜像的定义 考虑递归遍历 d f s mathrm dfs dfs 二叉树 交换每个节点的左 右子节点 即可生成 二叉树的镜像 递归解析
  • 【数据结构】树与二叉树

    文章目录 树型结构 什么是树型结构 树型结构的概念 树的表示形式 树的应用 二叉树 二叉树的概念 两种特殊的二叉树 二叉树的性质 二叉树性质练习 练习一 解析 练习二 解析 练习三 解析 练习四 解析 总结 树型结构 什么是树型结构 树是一
  • 由先序中序,或后序中序,可以唯一确定二叉树;完全二叉树的顺序存储,c/c++描述

    这是课本里的 两个定理 由先序 根左右 后序 左右根 可以确定根节点是哪个 由中序 左根右 可以确定左子树和右子树的范围 所以我们也找到了二叉树的左子树和右子树的先序 或后序 和中序排列 由归纳法 可得出这个构造二叉树链表的方法 对于完全二
  • 用 Java 实现的八种常用排序算法

    八种排序算法可以按照如图分类 前置知识 1 算法稳定性 在一个序列中 能保证两个相等的数 经过排序之后 其在序列的前后位置顺序不变 A1 A2 排序前 A1 在 A2 前面 排序后 A1 还在 A2 前面 2 时间复杂度 时间复杂度是用于衡
  • 求二叉树中两个指定节点的最短距离

    给定一个二叉树 找到该树中两个指定节点间的最短距离 思路 求最近公共祖先节点 然后再求最近公共祖先节点到两个指定节点的路径 再求两个节点的路径之和 const shortestDistance function root p q let l
  • 递归算法中的时间复杂度分析

    对于一种算法的时间复杂度分析还是特别重要的 在一些非递归算法中 我们仅仅看运算次数最多的那一行代码可能执行多少次就可以 实际就是看在循环中变量的变化 但是对于递归算法中该怎么分析呢 下面介绍几种递归函数中的算法时间复杂度分析的方法 0 递推
  • 前缀、中缀、后缀表达式和二叉树

    概念 前缀表达式 Prefix Notation 是指将运算符写在前面操作数写在后面的不包含括号的表达式 而且为了纪念其发明者波兰数学家Jan Lukasiewicz 所以前缀表达式也叫做 波兰表达式 后缀表达式 Postfix Notat
  • CH7-查找

    文章目录 1 查找的基本概念 2 线性表的查找 2 1 顺序查找 线性查找 算法2 1 0 类型定义 算法2 1 1 顺序查找 算法2 1 2 改进后的顺序查找 性能分析 2 2 折半查找 二分或对分查找 算法2 2 1 非递归算法 算法2
  • 树的广度优先遍历与深度优先遍历算法

    1 树的广度优先遍历算法 广度优先遍历算法 又叫宽度优先遍历 或横向优先遍历 是从根节点开始 沿着树的宽度遍历树的节点 如果所有节点均被访问 则算法中止 如上图所示的二叉树 A 是第一个访问的 然后顺序是 B C 然后再是 D E F G
  • 二叉树的各种操作函数

    include source h 满与空的问题 计算个数时 判断rear和front的大小1 2 空一个 void InitQueue Queue u u front 0 u rear 0 int sizeQue Queue u int s

随机推荐

  • 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