二叉树的前序,中序,后序,层序遍历实现(递归,迭代两种方式)

2023-11-07

先定义Node节点对象

public class Node{
		public int value;

		public Node left;

		public Node right;

		public Node(int value, Node left, Node right) {
			this.value = value;
			this.left = left;
			this.right = right;
		}
	}

前序遍历: 先遍历父节点,再遍历左子节点,最后遍历右子节点

1, 递归实现

/**
	 * 前序遍历递归实现
	 * @param root 根节点
	 */
	public static void preorderTraversal(Node root) {
		if(root == null) {
			return;
		}
		// 先遍历当前节点
		System.out.println(root.value);
		// 再遍历左子树
		preorderTraversal(root.left);
		// 再遍历右子树
		preorderTraversal(root.right);
	}

2, 迭代实现

/**
	 * 前序遍历迭代实现(借助栈的数据结构)
	 * @param root 根节点
	 */
	public static void preorderTraversalWithStack(Node root) {
		if (root == null) {
			return;
		}
		Stack<Node> stack = new Stack<>();
		stack.push(root);
		while (!stack.isEmpty()) {
			// 先遍历当前节点
			Node node = stack.pop();
			System.out.println(node);
			// 将右子节点先压栈,后遍历
			if (node.right != null) {
				stack.push(node.right);
			}
			// 将左子节点后压栈,先遍历
			if (node.left != null) {
				stack.push(node.left);
			}
		}
	}

中序遍历: 先遍历左子节点,再遍历父节点,最后遍历右子节点

1, 递归实现

/**
	 * 中序遍历递归实现
	 * @param root 根节点
	 */
	public static void inorderTraversal(Node root) {
		if(root == null) {
			return;
		}
		// 先遍历左子节点
		inorderTraversal(root.left);
		// 再遍历当前节点
		System.out.println(root.value);
		// 最后遍历右子节点
		inorderTraversal(root.right);
	}

2, 迭代实现

/**
	 * 中序遍历迭代实现(借助栈的数据结构)
	 * @param root 根节点
	 */
	public static void inorderTraversalWithStack(Node root) {
		if (root == null) {
			return;
		}
		Stack<Node> stack = new Stack<>();
		Node node = root;
		while(node != null || !stack.isEmpty()) {
			// 对父节点和左子节点循环压栈
			while(node != null) {
				stack.push(node);
				node = node.left;
			}
			// 先遍历后压栈的左子节点,再遍历先压栈的当前节点
			node = stack.pop();
			// 最后遍历右子节点
			node = node.right;
		}
	}

后续遍历: 先遍历左子节点,再遍历右子节点,最后遍历父节点

1, 递归实现

/**
	 * 后续遍历的递归实现
	 * @param root 根节点
	 */
	public static void postorderTraversal(Node root) {
		if (root == null) {
			return;
		}
		// 先遍历左子节点
		postorderTraversal(root.left);
		// 再遍历右子节点
		postorderTraversal(root.right);
		// 最后遍历当前节点
		System.out.println(root.value);
	}

2, 迭代实现

/**
	 * 后续遍历的迭代实现
	 * @param root 根节点
	 */
	public void postorderTraversalWithStack(Node root) {
		if (root == null) {
			return;
		}
		Stack<Node> stack = new Stack<>();
		// 记录上一次遍历到的节点
		Node prev = null;
		while(root != null || !stack.isEmpty()) {
			// 和中序遍历一样,不断将当前节点及其左子节点入栈
			while(root != null) {
				stack.push(root);
				root = root.left;
			}
			// 先弹出左子节点,并不能立马遍历该节点,只有当该节点没有右子节点或者右子节点已经先于它遍历了才能遍历它自己
			root = stack.pop();
			if (root.right == null || root.right == prev) {
				// 遍历当前节点
				System.out.println(root.value);
				// prev记录上一次遍历到的节点
				prev = root;
				// root置为null,是为了继续弹栈
				root = null;
			} else {
				// 说明之前弹出的节点有右子树,且右子树没有遍历过,先将该弹栈的节点压栈
				stack.push(root);
				// 然后继续该节点的右子树
				root = root.right;
			}
		}

	}

层序遍历: 按照层级关系从上到下依次遍历

/**
	 * 层序遍历的迭代实现(使用队列数据结构)
	 * @param root 根节点
	 */
	public static void levelOrderTraversal(Node root) {
		if (root == null) {
			return;
		}
		Queue<Node> queue = new LinkedList<>();
		queue.offer(root);
		while (!queue.isEmpty()) {
			Node node = queue.poll();
			// 遍历当前节点
			System.out.println(node.value);
			// 当前节点的左子节点入队列
			if(node.left != null) {
				queue.offer(node.left);
			}
			// 当前节点的右子节点入队列
			if (node.right != null) {
				queue.offer(node.right);
			}
		}
	}

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

二叉树的前序,中序,后序,层序遍历实现(递归,迭代两种方式) 的相关文章

  • 详解深度语义匹配模型DSSM

    所谓语义匹配 就是在语义上衡量文本的相似度 在产业界有很多的应用需求 例如 在FAQ场景中需要计算用户输入与标问之间的相似度来寻找合适的答案 本文介绍一种经典的语义匹配技术 DSSM 主要用于语料的召回和粗排 作者 编辑 小Dream哥 1
  • ZooKeeper-Curator-InterProcessMutex分布式锁源码

    这里写自定义目录标题 InterProcessMutex 可重入互斥锁 ConnectionStateListener 注意 临时节点下不能创建临时子节点 InterProcessMutex 可重入互斥锁 具体流程图 入口1 Overrid

随机推荐

  • 在vue3中如何使用百度地图API(详细步骤+demo示例)

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 注册账号 申请成为开发者 二 申请密钥AK 三 在vue3 0中使用百度地图API 提示 以下是本篇文章正文内容 下面案例可供参考 一 注册账号 申请成为开发者
  • linux VM与容器的存储IO性能测试

    linux VM与容器的存储IO测试 测试由KVM vmwarm virtualbox生产的VM和docker容器的存储IO性能 测试过程 1 分别在同一台物理机安装kvm和virtualbox的hypervisor 生产kvm virtu
  • 网络网段分类

    A类网段 0 0 0 0 127 255 255 255 B类网段 128 0 0 0 191 255 255 255 C类网段 192 0 0 0 223 255 255 255 D类网段 224 0 0 0 239 255 255 25
  • python多变量赋值和三元表达式出错(求解答)

    直接给出问题吧 以后只在定义是进行多变量同时赋值算了 希望有大神能够解答 定义变量 minL 0 a 0 b 1 subL 2 print minL a b subL 0 0 1 2 方法一 minL a subL b if subL lt
  • STM32双串口

    STM32双串口的使用 最近老是需要stm32通过串口去跟WiFi模块 蓝牙模块 openmv进行数据交互 然后需要用到stm32的串口调试 就把这个程序整理成一个工程 方便调试 实验目的 外设模块 WiFi模块 蓝牙模块 openmv 发
  • 神经网络调参:loss 问题汇总(震荡/剧烈抖动,loss不收敛/不下降)

    目录 1 模型不收敛主要原因 1 1 learning rate设大了会带来跑飞 loss突然一直很大 的问题 1 2 数据库太小一般不会带来不收敛的问题 1 3 尽量用小模型 2 模型loss 不下降 2 Loss 函数不收敛 2 1 l
  • electron 应用优雅的配置 about 信息

    使用 electron 的 dialog tray 托盘栏菜单优雅简单的配置 about 关于本应用的信息 效果下图所示 项目依赖 electron 24 4 1 electron builder 23 6 0 electron build
  • 库默尔定理学习小记

    A组又出现了逆天的数竞定理 随便口胡一下 定理 有两个正整数n m p是质数 Cnn m C n m n含 的幂次等于 在 进制下的进位数 简略证明 Cnn m C n m n含 的幂次 i 1 n mpi i 1 npi i 1 mpi
  • Oracle入门笔记(九)——视图、序列、索引、同义词和权限等

    视图和索引 1 视图 2 序列 3 索引 4 同义词 5 数据控制语言 DCL 6 执行计划 1 视图 视图是 基于数据表或者另外一个视图的逻辑表 类似于一个数据表或者数据表间组合之后得到的数据窗口 通过窗口能够查看数据表或者表间组合时候得
  • ELK 企业级日志分析系统(理论加实战部署详解)

    ELK 企业级日志分析系统 理论加实战部署详解 文章目录 一 ELK 概述 1 1 ELK 的工作原理 二 部署详解 一 ELK Elasticsearch 集群部署 在Node1 Node2节点上操作 二 ELK Logstash 部署
  • 【搜索引擎Solr】配置 Solr 以获得最佳性能

    Apache Solr 是广泛使用的搜索引擎 有几个著名的平台使用 Solr Netflix 和 Instagram 是其中的一些名称 我们在 tajawal 的应用程序中一直使用 Solr 和 ElasticSearch 在这篇文章中 我
  • 手撕代码:统计1到n二进制数中1出现的总次数

    题目描述 互娱手撕代码题 统计从1到n这n个数的二进制表示中1出现的次数 思路分析 思路一 直接的做法是从1遍历到n 对于每个数和1做与操作 之后 对于这个数不断做右移操作 不断和1做与操作 直到当前数为0 这样的算法复杂度为O nlogn
  • C++ 播放音频流(PCM裸流)

    直接上代码 如果有需要可以直接建一个win32控制台程序然后将代码拷过去改个文件名就可以用了 注意将声道和频率与你自己的文件对应 当然我自己也用VS2008写了个例子上传了 如果有需要下载地址如下 点击打开链接 这份代码是打开文件截取一段数
  • vue-amap 高德地图定位 点击获取经纬度和具体地址的使用

    官方文档地址 点这里 经纬度获取只要通过点击事件就可以通过e lnglat来获取 然后就是插件Geocoder使用了 在main js中initAMapApiLoader中写入 AMap Geocoder 注意 官方文档中有提示 所以插件中
  • webpack5 (三)

    webpack 高级配置 其实就是对 webpack 进行优化 让代码在编译 运行时性能更好 1 提升开发体验 2 提升打包构建速度 3 减少代码体积 4 优化代码运行性能 一 提升开发体验 sourcemap 在编译打包后所有的 css
  • 图片无损放大软件Topaz Gigapixel AI 5.5.2 win mac 汉化 mac只有英文版

    Topaz Gigapixel AI 5 5 2 win mac 汉化版 mac只有英文版 今天给大家带来一款超级强大的无损放大图片软件 在放大的同时还能够为你优化图片 真的不要太棒 这个软件的名字叫 Topaz Gigapixel AI
  • 【深度学习】卷积神经网络之图像分类|CNN、AlexNet、VGG、GoogLeNet、ResNet

    一 CNN 卷积神经网络分为卷积层 池化层 全连接层 softmax层 卷积层 卷积核与输入层中的一个区域相连 计算内积后加上权重 激活函数层 激活函数层包括在卷积层中 将相连的神经元进行激活 通常使用ReLu激活函数 m a x 0
  • 什么是元宇宙数字人,它距离我们还有多远呢?

    近期 元宇宙数字人 成为全球热议的焦点 众多资本方争相进入 使得互联网正在迎来转型为 元宇宙 的窗口期 究竟什么是 元宇宙数字人 它距离我们还有多远呢 元宇宙 最早是由是由科幻作家尼尔 斯蒂芬森于1992年在其著作 雪崩 中提出原始概念 元
  • list用Stream通过实体类的指定字段去重,排序

    public void testSelect List
  • 二叉树的前序,中序,后序,层序遍历实现(递归,迭代两种方式)

    先定义Node节点对象 public class Node public int value public Node left public Node right public Node int value Node left Node r