二叉树遍历(Java实现)

 

主要是二叉树的遍历,包括递归遍历和非递归遍历

  1. import java.util.ArrayDeque;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import java.util.Queue;
  5. public class BinaryNode<T> {
  6. /**
  7. * 泛型BinaryNode类
  8. */
  9. public T item;
  10. public BinaryNode<T> left,right;//左右子树
  11. public BinaryNode(T item)
  12. {
  13. this.item = item;
  14. left = right = null;
  15. }
  16. public BinaryNode (T item, BinaryNode<T> left, BinaryNode<T> right)
  17. {
  18. this.item = item;
  19. this.left = left;
  20. this.right = right;
  21. }
  22. public T getNodeValue() {
  23. return item;
  24. }
  25. public void setNodeValue(T item) {
  26. this.item = item;
  27. }
  28. public BinaryNode<T> getLeft() {
  29. return left;
  30. }
  31. public void setLeft(BinaryNode<T> left) {
  32. this.left = left;
  33. }
  34. public BinaryNode<T> getRight() {
  35. return right;
  36. }
  37. public void setRight(BinaryNode<T> right) {
  38. this.right = right;
  39. }
  40. //判断是否为叶子
  41. public boolean isLeaf(){
  42. return (left==null)&&(right==null);
  43. }
  44. //前序遍历二叉树(递归)
  45. public List<BinaryNode<T>> toStringPreorder(BinaryNode<T> node){
  46. List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
  47. list.add(node);
  48. if (node.left!=null) {
  49. list.addAll(toStringPreorder(node.left));
  50. }
  51. if (node.right!=null) {
  52. list.addAll(toStringPreorder(node.right));
  53. }
  54. return list;
  55. }
  56. //前序遍历二叉树(非递归)
  57. public List<BinaryNode<T>> toStringPreorderNoRec(BinaryNode<T> node){
  58. List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
  59. ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
  60. while ((node!=null)||!stack.isEmpty()) {
  61. if (node!=null) {
  62. list.add(node);
  63. stack.push(node);
  64. node=node.left;
  65. } else {
  66. node=stack.peek();
  67. stack.pop();
  68. node=node.right;
  69. }
  70. }
  71. return list;
  72. }
  73. //中序遍历二叉树
  74. public List<BinaryNode<T>> toStringInorder(BinaryNode<T> node){
  75. List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
  76. if (node.left!=null) {
  77. list.addAll(toStringPreorder(node.left));
  78. }
  79. list.add(node);
  80. if (node.right!=null) {
  81. list.addAll(toStringPreorder(node.right));
  82. }
  83. return list;
  84. }
  85. //中序遍历二叉树(非递归)
  86. public List<BinaryNode<T>> toStringInorderNoRec(BinaryNode<T> node){
  87. List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
  88. ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
  89. while ((node!=null)||!stack.isEmpty()) {
  90. if (node!=null) {
  91. stack.push(node);
  92. node=node.left;
  93. } else {
  94. node=stack.peek();
  95. list.add(node);
  96. stack.pop();
  97. node=node.right;
  98. }
  99. }
  100. return list;
  101. }
  102. //后序遍历二叉树
  103. public String toStringPostorder(){
  104. String result="";
  105. if (left!=null) {
  106. result += left.toStringPostorder();
  107. }
  108. if (right!=null) {
  109. result += right.toStringPostorder();
  110. }
  111. result += item;
  112. return result;
  113. }
  114. //后序遍历二叉树(非递归)
  115. /**
  116. * 先遍历树的逆后序遍历(根、右、左),在翻转逆后序遍历就是后序遍历二叉树(左、右、根)
  117. * @return result栈
  118. */
  119. public ArrayDeque<BinaryNode<T>> toStringPostorderNoRec(BinaryNode<T> node){
  120. ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
  121. ArrayDeque<BinaryNode<T>> result=new ArrayDeque<BinaryNode<T>>();
  122. while ((node!=null)||!stack.isEmpty()) {
  123. if (node!=null) {
  124. result.push(node);
  125. stack.push(node);
  126. node=node.right;
  127. } else {
  128. node=stack.peek();
  129. stack.pop();
  130. node=node.left;
  131. }
  132. }
  133. return result;
  134. }
  135. //后序遍历二叉树2(非递归)
  136. /**
  137. * 要保证根结点在左孩子和右孩子访问之后才能访问,因此对于任一结点P,先将其入栈。如果P不存在左孩子和右孩子,则可以直接访问它;
  138. * 或者P存在左孩子或者右孩子,但是其左孩子和右孩子都已被访问过了,则同样可以直接访问该结点。若非上述两种情况,
  139. * 则将P的右孩子和左孩子依次入栈,这样就保证了每次取栈顶元素的时候,左孩子在右孩子前面被访问,左孩子和右孩子都在根结点前面被访问。
  140. * @return result栈
  141. */
  142. public ArrayList<BinaryNode<T>> toStringPostorderNoRec2(BinaryNode<T> root){
  143. ArrayDeque<BinaryNode<T>> stack=new ArrayDeque<BinaryNode<T>>();
  144. ArrayList<BinaryNode<T>> result=new ArrayList<BinaryNode<T>>();
  145. BinaryNode<T> curr;//当前栈顶指针
  146. BinaryNode<T> pre=null;//前一次访问节点
  147. stack.push(root);
  148. while (!stack.isEmpty()) {
  149. curr=stack.peek();
  150. if ((curr.left==null&&curr.right==null)||(pre!=null&&(pre==curr.left||pre==curr.right))) {
  151. result.add(curr);//输出结果
  152. stack.pop();
  153. pre=curr;
  154. } else {
  155. if (curr.right!=null) {
  156. stack.push(curr.right);
  157. }
  158. if (curr.left!=null) {
  159. stack.push(curr.left);
  160. }
  161. }
  162. }
  163. return result;
  164. }
  165. //层序遍历(广度优先遍历)
  166. public List<BinaryNode<T>> toStringLevelOrder(){
  167. List<BinaryNode<T>> list=new ArrayList<BinaryNode<T>>();
  168. Queue<BinaryNode<T>> queue=new ArrayDeque<BinaryNode<T>>();
  169. queue.offer(this);//root
  170. while (!(queue.isEmpty())) {
  171. list.add(queue.peek());
  172. BinaryNode<T> node=queue.poll();
  173. if (node.left != null) {
  174. queue.offer(node.left);
  175. }
  176. if (node.right != null) {
  177. queue.offer(node.right);
  178. }
  179. }
  180. return list;
  181. }
  182. }

二叉树遍历(Java实现)的更多相关文章

  1. 二叉树遍历-JAVA实现

    二叉树遍历分为前序.中序.后序递归和非递归遍历.还有层序遍历. //二叉树节点 public class BinaryTreeNode { private int data; private Bina ...

  2. 二叉树遍历Java实现

    [仅贴代码及测试结果] -------------------BinaryTree.java------------------------------ class Tree<E>{ E ...

  3. 数据结构二叉树的java实现,包括二叉树的创建、搜索、删除和遍历

    根据自己的学习体会并参考了一些网上的资料,以java写出了二叉树的创建.搜索.删除和遍历等操作,尚未实现的功能有:根据先序和中序遍历,得到后序遍历以及根据后序和中序遍历,得到先序遍历,以及获取栈的深度 ...

  4. 二叉树 Java 实现 前序遍历 中序遍历 后序遍历 层级遍历 获取叶节点 宽度 ,高度,队列实现二叉树遍历 求二叉树的最大距离

    数据结构中一直对二叉树不是很了解,今天趁着这个时间整理一下 许多实际问题抽象出来的数据结构往往是二叉树的形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显 ...

  5. java 二叉树遍历

    package com.lever; import java.util.LinkedList;import java.util.Queue; /** * 二叉树遍历 * @author lckxxy ...

  6. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  7. 【数据结构】之二叉树的java实现

    转自:http://blog.csdn.net/wuwenxiang91322/article/details/12231657 二叉树的定义: 二叉树是树形结构的一个重要类型.许多实际问题抽象出来的 ...

  8. 二分法与二叉树的 Java 实现

    算法与数据结构始终是计算机基础的重要一环,今天我们来讨论下 Java 中二叉树的实现以及一些简单的小算法,如二分查找,归并排序等. 二分查找 二分查找是一种在有序数组中查找某一特定元素的搜索算法,它在 ...

  9. 二叉树的Java实现及特点总结

    二叉树是一种非常重要的数据结构,它同时具有数组和链表各自的特点:它可以像数组一样快速查找,也可以像链表一样快速添加.但是他也有自己的缺点:删除操作复杂. 我们先介绍一些关于二叉树的概念名词. 二叉树: ...

随机推荐

  1. ABAP:从例子学习ABAP

    1.插入内表行: *插入内表行: DATA: BEGIN OF man, name(20) TYPE c, high TYPE p DECIMALS 2, weight TYPE p DECIMALS ...

  2. TAS5508 output changing

    1.如果信号从3th通道输入,正常就是从PWM5,6输出,现在要想从PWM7,8输出,就按照以下红线部分选择DAP CH5和DAP CH6,然后写入相应寄存器产生的12 bytes的数组数据即可.

  3. Android 悬浮窗权限各机型各系统适配大全

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...

  4. 【Shell脚本学习24】Shell输入输出重定向:Shell Here Document,/dev/null文件

    Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出重定向 命令的输出不仅可以 ...

  5. Jquery里面的$(this)和this, 有什么区别

    当你用的是jquery时,就用$(this),如果是JS,就用this $(this).html( $(this).html() + " BAM! "); 这个里的html()是J ...

  6. 【洛谷1580】yyy loves Easter_Egg I(字符串处理题)

    点此看题面 大致题意: 略.(一道模拟题,自己去看题面吧) 几个字符数组函数 纯粹是一道字符串处理题,就当是学了一下各种与字符数组相关的函数吧! \(gets()\):这个是比较常用的函数,就是读入一 ...

  7. python_17_数据运算

    #//取整除,返回商的整数部分 print(9//2) print(10/3.3) print(10//3.0) #<>与!=都为不等于 #and 与 例(a and b) #or 或 # ...

  8. SummerVocation_Learning--StringBuffer类

    java.lang.StringBuffer代表可变的字符序列.与String类基本类似. 常见的构造方法: StringBuffer(),创建一个不包含字符序列的空的StringBuffer对象. ...

  9. SAP后台JOB的Submit & EVENT JOB

    SM35执行一个后台作业后,想及时停止, 运行SM37后,点击ctr + F1停止活动的作业,系统根本就没反应. 解决方法: 第一步:SM50, 找到,Ty.列为BGD的(Background),然后 ...

  10. Windows 下编辑 hosts 文件

    hosts 文件目录: C:\WINDOWS\system32\drivers\etc\hosts hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应 ...