java二叉树的深度优先遍历_二叉树的广度优先遍历、深度优先遍历的递归和非递归实现方式...

1 packageSolution;2

3 importjava.util.LinkedList;4 importjava.util.Queue;5 importjava.util.Stack;6

7

8 public classBinaryTree {9

10 //二叉树节点

11 public static classBinaryTreeNode {12 intvalue;13 BinaryTreeNode left;14 BinaryTreeNode right;15

16 public BinaryTreeNode(intvalue) {17 this.value =value;18 }19

20 public BinaryTreeNode(intvalue, BinaryTreeNode left,21 BinaryTreeNode right) {22 super();23 this.value =value;24 this.left =left;25 this.right =right;26 }27

28 }29

30 //访问树的节点

31 public static voidvisit(BinaryTreeNode node) {32 System.out.println(node.value);33 }34

35 /**递归实现二叉树的先序遍历*/

36 public static voidpreOrder(BinaryTreeNode node) {37 if (node != null) {38 visit(node);39 preOrder(node.left);40 preOrder(node.right);41 }42 }43

44 /**递归实现二叉树的中序遍历*/

45 public static voidinOrder(BinaryTreeNode node) {46 if (node != null) {47 inOrder(node.left);48 visit(node);49 inOrder(node.right);50 }51 }52

53 /**递归实现二叉树的后序遍历*/

54 public static voidpostOrder(BinaryTreeNode node) {55 if (node != null) {56 postOrder(node.left);57 postOrder(node.right);58 visit(node);59 }60 }61

62 /**非递归实现二叉树的先序遍历*/

63 public static voiditerativePreorder(BinaryTreeNode node) {64 Stack stack = new Stack<>();65 if (node != null) {66 stack.push(node);67 while (!stack.empty()) {68 node =stack.pop();69 //先访问节点

70 visit(node);71 //把右子结点压入栈

72 if (node.right != null) {73 stack.push(node.right);74 }75 //把左子结点压入栈

76 if (node.left != null) {77 stack.push(node.left);78 }79 }80 }81 }82

83 /**非递归实现二叉树的中序遍历*/

84 public static voiditerativeInOrder(BinaryTreeNode root) {85 Stack stack = new Stack<>();86 BinaryTreeNode node =root;87 while (node != null || stack.size() > 0) {88 //把当前节点的所有左侧子结点压入栈

89 while (node != null) {90 stack.push(node);91 node =node.left;92 }93 //访问节点,处理该节点的右子树

94 if (stack.size() > 0) {95 node =stack.pop();96 visit(node);97 node =node.right;98 }99 }100 }101

102 /**非递归使用单栈实现二叉树后序遍历*/

103 public static voiditerativePostOrder(BinaryTreeNode root) {104 Stack stack = new Stack<>();105 BinaryTreeNode node =root;106 //访问根节点时判断其右子树是够被访问过

107 BinaryTreeNode preNode = null;108 while (node != null || stack.size() > 0) {109 //把当前节点的左侧节点全部入栈

110 while (node != null) {111 stack.push(node);112 node =node.left;113 }114 if (stack.size() > 0) {115 BinaryTreeNode temp =stack.peek().right;116 //一个根节点被访问的前提是:无右子树或右子树已被访问过

117 if (temp == null || temp ==preNode) {118 node =stack.pop();119 visit(node);120 preNode = node;//记录刚被访问过的节点

121 node = null;122 } else{123 //处理右子树

124 node =temp;125 }126 }127 }128 }129

130 /**非递归使用双栈实现二叉树后序遍历*/

131 public static voiditerativePostOrderByTwoStacks(BinaryTreeNode root) {132 Stack stack = new Stack<>();133 Stack temp = new Stack<>();134 BinaryTreeNode node =root;135 while (node != null || stack.size() > 0) {136 //把当前节点和其右侧子结点推入栈

137 while (node != null) {138 stack.push(node);139 temp.push(node);140 node =node.right;141 }142 //处理栈顶节点的左子树

143 if (stack.size() > 0) {144 node =stack.pop();145 node =node.left;146 }147 }148 while (temp.size() > 0) {149 node =temp.pop();150 visit(node);151 }152 }153

154 /**二叉树广度优先遍历——层序遍历*/

155 public static voidlayerTraversal(BinaryTreeNode root) {156 Queue queue = new LinkedList<>();157

158 if (root != null) {159 queue.add(root);160 while (!queue.isEmpty()) {161 BinaryTreeNode currentNode =queue.poll();162 visit(currentNode);163 if (currentNode.left != null) {164 queue.add(currentNode.left);165 }166

167 if (currentNode.right != null) {168 queue.add(currentNode.right);169 }170

171 }172 }173 }174

175 public static voidmain(String[] args) {176

177 //构造二叉树178 //1179 ///180 //2 3181 /// /182 //4 5 7183 //\ /184 //6 8

185 BinaryTreeNode root = new BinaryTreeNode(1);186 BinaryTreeNode node2 = new BinaryTreeNode(2);187 BinaryTreeNode node3 = new BinaryTreeNode(3);188 BinaryTreeNode node4 = new BinaryTreeNode(4);189 BinaryTreeNode node5 = new BinaryTreeNode(5);190 BinaryTreeNode node6 = new BinaryTreeNode(6);191 BinaryTreeNode node7 = new BinaryTreeNode(7);192 BinaryTreeNode node8 = new BinaryTreeNode(8);193

194 root.left =node2;195 root.right =node3;196 node2.left =node4;197 node3.left =node5;198 node3.right =node7;199 node5.right =node6;200 node7.left =node8;201 System.out.println("二叉树先序遍历");202 preOrder(root);203 System.out.println("二叉树先序遍历非递归");204 iterativePreorder(root);205 System.out.println("二叉树中序遍历");206 inOrder(root);207 System.out.println("二叉树中序遍历非递归");208 iterativeInOrder(root);209 System.out.println("二叉树后序遍历");210 postOrder(root);211 System.out.println("二叉树单栈非递归后序遍历");212 iterativePostOrder(root);213 System.out.println("二叉树双栈非递归后序遍历");214 iterativePostOrderByTwoStacks(root);215 System.out.println("二叉树层树序遍历");216 layerTraversal(root);217 }218 }

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

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

相关文章

NET问答: 如何给 ASP.NET Core 配置指定端口 ?

咨询区 Drew Noakes&#xff1a;我是 ASP.NET Core 方面是新人&#xff0c;我发现程序默认的端口是 5000&#xff0c;因为要正式发布&#xff0c;所以希望把程序的端口改成 80&#xff0c;请问我该如何配置自定义端口呢 &#xff1f;回答区 Kvin Chalet&#xff1a;在 ASP.NET …

硬货 | 一片小小的薄膜,却可以粘住全世界!

延续“设计激发积极生活”的理念&#xff0c;在这个中秋&#xff0c;GYMLIVING特别推出月亮概念新产品&#xff0c;在便利生活的同时&#xff0c;为你带来一份浪漫和惊喜&#xff01;说起月亮&#xff0c;除了阴晴圆缺&#xff0c;月球漫步更让它成了浪漫的代名词。有公司正计划…

使用域超级管理员打开Exchange 2010发现没有权限

1.使用administrator管理员打开EMC却报没有权限。 2.发现此问题&#xff0c;系邮件服务器本身上安装了outlook软件&#xff0c;并配置了使用非administrator账户收信。并有做了Windows保存了用户凭据&#xff0c;造成帐号使用上的混乱&#xff0c;导致连接Exchange服务器时使用…

C# 将多个图片合并成TIFF文件的两种方法

最近需要用到TIF格式的文件&#xff0c;研究了一段时间&#xff0c;终于有点结果了&#xff0c;发现两种方式&#xff0c;第一种是使用BitMiracle.LibTiff.NET&#xff0c;直接在Nuget上安装即可&#xff0c;第二种是使用RasterEdge.DocImageSDK&#xff0c;要从官网下载dll包第…

高等数学、线性代数、概率论与数理统计、几何学这些知识可以用来干什么?主要应用有哪些?...

全世界有3.14 % 的人已经关注了数据与算法之美知乎谢漠烟其他三项&#xff0c;不研究少数工科确实没用&#xff0c;但概率统计真乃应用数学之王。鄙人学业从数学院开始&#xff0c;以经济学院结束&#xff0c;现在在证券公司做苦逼行业研究&#xff0c;深有体会。概率统计抛开了…

HDU 2896 病毒侵袭【AC自动机】

Problem Description当太阳的光辉逐渐被月亮遮蔽&#xff0c;世界失去了光明&#xff0c;大地迎来最黑暗的时刻。。。。在这样的时刻&#xff0c;人们却异常兴奋——我们能在有生之年看到500年一遇的世界奇观&#xff0c;那是多么幸福的事儿啊~~但网路上总有那么些网站&#xf…

.NET 中安全高效跨平台的模板引擎 Fluid 使用文档

Liquid 是一门开源的模板语言&#xff0c;由 Shopify 创造并用 Ruby 实现。它是 Shopify 主题的主要构成部分&#xff0c;并且被用于加载店铺系统的动态内容。它是一种安全的模板语言&#xff0c;对于非程序员的受众来说也非常容易理解。Fluid 是一个基于 Liquid 模板语言的开源…

风靡全球的人工智能,如何赶上这班车?

目前&#xff0c;机器学习的使用日渐成为趋势。作为人工智能的核心&#xff0c;机器学习是一门多领域的交叉学科&#xff0c;专门研究计算机模拟或实现人类学习行为的方法&#xff0c;以获取新的知识或技能&#xff0c;重新组织已有的知识结构使之不断改善自身的性能。简单来说…

java spark读写hdfs_Spark读取HDFS数据输出到不同的文件

最近有一个需求是这样的&#xff1a;原来的数据是存储在MySQL&#xff0c;然后通过Sqoop将MySQL的数据抽取到了HDFS集群上&#xff0c;抽取到HDFS上的数据都是纯数据&#xff0c;字段值之间以\t分隔&#xff0c;现在需要将这部分数据还原为json格式的&#xff0c;因为这样做的原…

15个创意的电梯广告

如果你走进任何一个城市&#xff0c;几乎每一个地方有电梯&#xff0c;但是你发现具有创意的广告电梯了吗&#xff0c;分享给大家15个不同城市的创意的电梯广告&#xff0c;作为设计师可以帮助你 Accor Air Asia Becel Body World Coke Zero Consol Energy Fiat Punto Forklift…

揭秘全球开发最新趋势!JS开发者达1380万,C#超越PHP,Rust增长最快

文 | 白开水出品 | OSC开源社区&#xff08;ID&#xff1a;oschina2013&#xff09;研究公司 SlashData 最新发布的”State of the Developer Nation“第 20 版报告指出&#xff0c;全球开发者社区在过去六个月中的经历了巨大的增长。据估计&#xff0c;截至 2021 年第一季度&a…

怎样判断漂亮女孩是不是单身的?

全世界有3.14 % 的人已经关注了数据与算法之美不解风情的死理性派们在情感生活中不免会遇到这样悲催的一幕&#xff1a;偶然间遇到一位心仪的漂亮女孩&#xff0c;从此日思夜想&#xff0c;废寝忘食&#xff0c;开始了漫长的暗恋之旅。等到一日&#xff0c;在无尽的纠结中&…

java开源cad_寻找 AutoCAD 替代品,5款免费开源 CAD 软件推荐

FreeCADFreeCAD 是一种通用的3D CAD建模。完全开源(LGPL许可证)FreeCAD 直接的目的是在机械工程和产品设计&#xff0c;也适合在更广泛的用途&#xff0c;如建筑行业或其他工程专业&#xff0c;工程相关领域。FreeCAD 全平台通用&#xff0c;能完美工作在 Windows、Linux 和 ma…

JavaScript对SEO的影响及解决之道

不只是Google&#xff0c;yahoo在官方文档中也有类似的夸大&#xff1a;  尽量使用搜索引擎能够识别的文本信息&#xff0c;防止过多的JavaScript、Cookie、框架、DHTML 或 Flash 等繁杂技术。  http://help.cn.yahoo.com/answerpage_2911.html  百度虽然没有明确的说明&…

快速弄懂陌生领域是一项“赚钱”的能力

大家好&#xff0c;我是Z哥。有时候&#xff0c;我们被动的需要去了解一个新行业或者领域。比如&#xff0c;工作需要、投资需要等等。在这个时候&#xff0c;你能不能快速弄懂一个行业的80%&#xff0c;成为一个内行就很关键了。毕竟时机可是很重要的。比如&#xff0c;你想了…

java弹窗 触发事件_关于ElementUI中MessageBox弹框的取消键盘触发事件(enter,esc)关闭弹窗(执行事件)的解决方法...

好久没见了在项目中遇到一个小小的需求&#xff0c;总结了一下&#xff01;详细我就不介绍了&#xff0c;相信大家用过的话&#xff0c;很了解。详见文档----------->http://element-cn.eleme.io/#/zh-CN/component/message-box#messagebox-dan-kuang项目需求——关于Elemen…

6年后再一次Hello World!这本书让你久等了!

移动互联网和手机智能化浪潮带来了全新的手机游戏模式。而随着手机游戏开发逐渐成熟&#xff0c;手机游戏开发门槛的降低&#xff0c;越来越多的开发者希望加入到这一行业中。Unity作为一款优秀的游戏引擎&#xff0c;为广大游戏开发者提供了高效、简洁的开发流程&#xff0c;使…

[转]模拟电路设计经典教材推荐

终于开通博客了&#xff0c;给大家推荐基本经典教材&#xff0c;我也是从一位师兄那得到的&#xff01; 1. 拉扎维的《模拟CMOS集成电路设计》&#xff0c;我们研二模电课的教材&#xff0c;汪宁老师把这门课讲得可圈可点。当时没意识到有其他书&#xff0c;于是我就把此书读了…

MATLAB图像处理与数字信号处理资料分享来袭

小天从大学开始接触数学建模&#xff0c;便开启资料收集功能。经过近几年的积累和沉淀&#xff0c;再加上对数学建模领域的深入研究&#xff0c;收集整理了丰富的数学建模资料&#xff0c;内容涵盖“MATLAB图像处理”&#xff0c;“数字信号处理与MATLAB实现”等。截止到今天&a…

java换水_java-交流灌水之谁是水王?

设计思想&#xff1a;水王是发帖和回帖最多的那个&#xff0c;总数会超过总贴数的一半还要多&#xff0c;我的思想是&#xff0c;当两个挨着的人发帖的id不同就进行抵消&#xff0c;最后剩下来的就是总数超过一半的“水王”的id;代码实现:package demo;public class text1 {sta…