一个用于实现初始化指定个数的完全二叉树,以及两个非递归的深度优先遍历,和广度优先遍历

  1. package fifth;
  2. import java.util.Random;
  3. public class Tool{
  4. public static Random rand= new Random();
  5. }
  6. -------------------------------------------------------------
  7. package fifth;
  8. import java.util.EmptyStackException;
  9. import java.util.LinkedList;
  10. import java.util.Queue;
  11. import java.util.Stack;
  12. public class Tree {
  13. //用来实现非递归的广度优先查询与构造需要的队列
  14. public static Queue<Tree> que= new LinkedList<Tree>();
  15. //用来实现深度优先查询需要的栈
  16. public static Stack<Tree> stack=new Stack<Tree>();
  17. //存储的节点信息
  18. public int data;
  19. public Tree leftNode=null;
  20. public Tree rightNode=null;
  21. //用来实现遍历的临时节点
  22. public Tree cTree=null;
  23. public Tree() {
  24. data=Tool.rand.nextInt(200);
  25. display();
  26. }
  27. public void display(){
  28. System.out.print(data+",");
  29. }
  30. /**
  31. * 创建一个以这个节点为定点的完全二叉树
  32. * 这个中初始化方法类似于广度优先遍历
  33. * @param count 要创建的完全二叉树的节点个数
  34. */
  35. public void initTree(int count){
  36. que.add(this);
  37. while((cTree=que.poll())!=null)
  38. {
  39. //当树中需要创建节点数小于两个时,那么就应该创造完叶子节点然后返回
  40. //当树中需要创建节点个数大于两个时,那么就应该把创造的子节点放入队列中,等待创建它的子节点
  41. if(count-2>0)
  42. {
  43. cTree.leftNode=new Tree();
  44. que.add(cTree.leftNode);
  45. count--;
  46. cTree.rightNode=new Tree();
  47. que.add(cTree.rightNode);
  48. count--;
  49. }
  50. else if(count==0)
  51. {
  52. break;
  53. }
  54. else if(count==1)
  55. {
  56. cTree.leftNode=new Tree();
  57. count--;
  58. break;
  59. }
  60. else
  61. {
  62. cTree.leftNode=new Tree();
  63. cTree.rightNode=new Tree();
  64. count-=2;
  65. }
  66. }
  67. }
  68. /**
  69. * 非递归的广度优先遍历,用的队列来实现
  70. */
  71. public void breadthSearch(){
  72. System.out.print('\n'+"非递归广度优先遍历:");
  73. //清空队列,同时把自己放在队列的第一个元素
  74. que.clear();que.add(this);
  75. while((cTree=que.poll())!=null)
  76. {
  77. //访问队列中的数据
  78. cTree.display();
  79. if(cTree.leftNode!=null)
  80. {
  81. que.add(cTree.leftNode);
  82. }
  83. if(cTree.rightNode!=null)
  84. {
  85. que.add(cTree.rightNode);
  86. }
  87. }
  88. }
  89. /**
  90. * 用于栈来实现的非递归深度优先遍历 前序遍历
  91. */
  92. public void deepFirstSearch(){
  93. System.out.print('\n'+"非递归深度优先遍历,前序遍历:");
  94. //首先把自己压入栈底
  95. this.display();
  96. cTree=this;
  97. while(cTree!=null)
  98. {
  99. if(cTree.leftNode!=null)
  100. {
  101. stack.add(cTree);
  102. cTree.leftNode.display();
  103. cTree=cTree.leftNode;
  104. }
  105. else
  106. {
  107. while(cTree.rightNode==null)
  108. {
  109. try
  110. {
  111. cTree=stack.pop();
  112. }
  113. catch(EmptyStackException e)
  114. {
  115. return;
  116. }
  117. }
  118. cTree.rightNode.display();
  119. cTree=cTree.rightNode;
  120. }
  121. }
  122. }
  123. public static void main(String[] args) {
  124. Tree tree= new Tree();
  125. tree.initTree(10);
  126. System.out.println();
  127. tree.leftNode.display();
  128. tree.rightNode.display();
  129. tree.breadthSearch();
  130. tree.deepFirstSearch();
  131. }
  132. }

转载于:https://blog.51cto.com/joeymiu/683757

完全二叉树的JAVA实现(以及非递归遍历方法)相关推荐

  1. 【树】二叉树的两种非递归遍历方法

    非递归的遍历需要使用栈保存当前不输出的结点,并且三种遍历顺序步骤有所不同. 中序遍历 1.查看其当前结点是否为空: 若非空则将当前结点入栈,指针指向其左孩子: 若当前结点为空,说明上一个入栈的结点没有 ...

  2. 【Java数据结构】非递归遍历二叉树

    目录 1. 定义二叉树结点类TreeNode 2. 前序遍历(非递归) 3. 中序遍历(非递归) 4. 后序遍历(非递归) 1. 定义二叉树结点类TreeNode public class TreeN ...

  3. 更简单的非递归遍历二叉树的方法

    解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...

  4. 对于二叉树三种非递归遍历方式的理解

    利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...

  5. 【转】更简单的非递归遍历二叉树的方法

    [转]更简单的非递归遍历二叉树的方法 解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出 ...

  6. c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...

    本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...

  7. 更简单的非递归遍历二叉树

    解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...

  8. java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...

    import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...

  9. 非递归遍历N-ary树Java实现

    2019-03-25 14:10:51 非递归遍历二叉树的Java版本实现之前已经进行了总结,这次做的是非递归遍历多叉树的Java版本实现. 在非递归遍历二叉树的问题中我个人比较推荐的是使用双whil ...

最新文章

  1. 一个不错的js制作的右键菜单
  2. ASP.NET MVC 3 RTM
  3. PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
  4. qiaoye.php,全自动无限生成关键词页面(黑帽SEO优化终极方法)
  5. 由对称性知定点一定在x轴上_线上优秀教学案例(九)|计算机科学与工程学院刘钊:“延期不延教”之“1+X课堂”...
  6. 流式数据分析_流式大数据分析
  7. python中import sys_python import sys出错怎么办
  8. Oracle Minus关键字
  9. 达摩院 2020 预测:感知智能的“天花板”和认知智能的“野望”
  10. MVC+EF 入门教程(四)
  11. linux中断处理程序架构,Linux外部中断架构初始化流程-----Tiny6410
  12. 互联网网站采集工具大比拼和选择指南
  13. 红杉、IDG、北极光、顺为等投资大咖怎么看智能硬件
  14. 宋体测试液晶屏测试小程序
  15. zabbix Trapper 监控项配置
  16. poi 读取excel合并单元格两种方式
  17. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影系统
  18. Outlook-VBA-03-收件箱附件处理
  19. ZLib 解压缩工具
  20. 今日芯声 | 别乱拍照!多位英国明星iCloud被黑裸照泄露

热门文章

  1. 【AI产品】超长文详解作业帮产品逻辑和技术原理
  2. 全球及中国现金回收机行业销售前景与运营效益分析报告2022版
  3. 全球及中国蔬菜泥配料行业竞争策略及投资潜力研究报告2021-2027年版
  4. CryptoAPI与openssl数字签名与验证交互
  5. 软件需求分析文档模版
  6. VUE初长成【部分小记】
  7. 纯数学思想——在哈尔滨的寒风中
  8. 短学期实训——第二篇
  9. c++ 单例模式 对全局变量的替代
  10. 多线程的两种实现方式和区别?