完全二叉树的JAVA实现(以及非递归遍历方法)
一个用于实现初始化指定个数的完全二叉树,以及两个非递归的深度优先遍历,和广度优先遍历
- package fifth;
- import java.util.Random;
- public class Tool{
- public static Random rand= new Random();
- }
- -------------------------------------------------------------
- package fifth;
- import java.util.EmptyStackException;
- import java.util.LinkedList;
- import java.util.Queue;
- import java.util.Stack;
- public class Tree {
- //用来实现非递归的广度优先查询与构造需要的队列
- public static Queue<Tree> que= new LinkedList<Tree>();
- //用来实现深度优先查询需要的栈
- public static Stack<Tree> stack=new Stack<Tree>();
- //存储的节点信息
- public int data;
- public Tree leftNode=null;
- public Tree rightNode=null;
- //用来实现遍历的临时节点
- public Tree cTree=null;
- public Tree() {
- data=Tool.rand.nextInt(200);
- display();
- }
- public void display(){
- System.out.print(data+",");
- }
- /**
- * 创建一个以这个节点为定点的完全二叉树
- * 这个中初始化方法类似于广度优先遍历
- * @param count 要创建的完全二叉树的节点个数
- */
- public void initTree(int count){
- que.add(this);
- while((cTree=que.poll())!=null)
- {
- //当树中需要创建节点数小于两个时,那么就应该创造完叶子节点然后返回
- //当树中需要创建节点个数大于两个时,那么就应该把创造的子节点放入队列中,等待创建它的子节点
- if(count-2>0)
- {
- cTree.leftNode=new Tree();
- que.add(cTree.leftNode);
- count--;
- cTree.rightNode=new Tree();
- que.add(cTree.rightNode);
- count--;
- }
- else if(count==0)
- {
- break;
- }
- else if(count==1)
- {
- cTree.leftNode=new Tree();
- count--;
- break;
- }
- else
- {
- cTree.leftNode=new Tree();
- cTree.rightNode=new Tree();
- count-=2;
- }
- }
- }
- /**
- * 非递归的广度优先遍历,用的队列来实现
- */
- public void breadthSearch(){
- System.out.print('\n'+"非递归广度优先遍历:");
- //清空队列,同时把自己放在队列的第一个元素
- que.clear();que.add(this);
- while((cTree=que.poll())!=null)
- {
- //访问队列中的数据
- cTree.display();
- if(cTree.leftNode!=null)
- {
- que.add(cTree.leftNode);
- }
- if(cTree.rightNode!=null)
- {
- que.add(cTree.rightNode);
- }
- }
- }
- /**
- * 用于栈来实现的非递归深度优先遍历 前序遍历
- */
- public void deepFirstSearch(){
- System.out.print('\n'+"非递归深度优先遍历,前序遍历:");
- //首先把自己压入栈底
- this.display();
- cTree=this;
- while(cTree!=null)
- {
- if(cTree.leftNode!=null)
- {
- stack.add(cTree);
- cTree.leftNode.display();
- cTree=cTree.leftNode;
- }
- else
- {
- while(cTree.rightNode==null)
- {
- try
- {
- cTree=stack.pop();
- }
- catch(EmptyStackException e)
- {
- return;
- }
- }
- cTree.rightNode.display();
- cTree=cTree.rightNode;
- }
- }
- }
- public static void main(String[] args) {
- Tree tree= new Tree();
- tree.initTree(10);
- System.out.println();
- tree.leftNode.display();
- tree.rightNode.display();
- tree.breadthSearch();
- tree.deepFirstSearch();
- }
- }
转载于:https://blog.51cto.com/joeymiu/683757
完全二叉树的JAVA实现(以及非递归遍历方法)相关推荐
- 【树】二叉树的两种非递归遍历方法
非递归的遍历需要使用栈保存当前不输出的结点,并且三种遍历顺序步骤有所不同. 中序遍历 1.查看其当前结点是否为空: 若非空则将当前结点入栈,指针指向其左孩子: 若当前结点为空,说明上一个入栈的结点没有 ...
- 【Java数据结构】非递归遍历二叉树
目录 1. 定义二叉树结点类TreeNode 2. 前序遍历(非递归) 3. 中序遍历(非递归) 4. 后序遍历(非递归) 1. 定义二叉树结点类TreeNode public class TreeN ...
- 更简单的非递归遍历二叉树的方法
解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...
- 对于二叉树三种非递归遍历方式的理解
利用栈实现二叉树的先序,中序,后序遍历的非递归操作 栈是一种先进后出的数据结构,其本质应是记录作用,支撑回溯(即按原路线返回):因此,基于其的二叉树遍历操作深刻的体现了其特性: 若后续的输入和其前面的 ...
- 【转】更简单的非递归遍历二叉树的方法
[转]更简单的非递归遍历二叉树的方法 解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出 ...
- c语言以顺序结构存储的二叉树的非递归遍历,C语言二叉树的非递归遍历实例分析...
本文以实例形式讲述了C语言实现二叉树的非递归遍历方法.是数据结构与算法设计中常用的技巧.分享给大家供大家参考.具体方法如下: 先序遍历: void preOrder(Node *p) //非递归 { ...
- 更简单的非递归遍历二叉树
解决二叉树的很多问题的方案都是基于对二叉树的遍历.遍历二叉树的前序,中序,后序三大方法算是计算机科班学生必写代码了.其递归遍历是人人都能信手拈来,可是在手生时写出非递归遍历恐非易事.正因为并非易事,所 ...
- java 建树源码_Java实现的二叉树常用操作【前序建树,前中后递归非递归遍历及层序遍历】...
import java.util.ArrayDeque; import java.util.Queue; import java.util.Stack; //二叉树的建树,前中后 递归非递归遍历 层序 ...
- 非递归遍历N-ary树Java实现
2019-03-25 14:10:51 非递归遍历二叉树的Java版本实现之前已经进行了总结,这次做的是非递归遍历多叉树的Java版本实现. 在非递归遍历二叉树的问题中我个人比较推荐的是使用双whil ...
最新文章
- 一个不错的js制作的右键菜单
- ASP.NET MVC 3 RTM
- PaddleOCR——申请显存不足【Allocate too much memory for the GPU memory pool, assigned 8000 MB】解决方案
- qiaoye.php,全自动无限生成关键词页面(黑帽SEO优化终极方法)
- 由对称性知定点一定在x轴上_线上优秀教学案例(九)|计算机科学与工程学院刘钊:“延期不延教”之“1+X课堂”...
- 流式数据分析_流式大数据分析
- python中import sys_python import sys出错怎么办
- Oracle Minus关键字
- 达摩院 2020 预测:感知智能的“天花板”和认知智能的“野望”
- MVC+EF 入门教程(四)
- linux中断处理程序架构,Linux外部中断架构初始化流程-----Tiny6410
- 互联网网站采集工具大比拼和选择指南
- 红杉、IDG、北极光、顺为等投资大咖怎么看智能硬件
- 宋体测试液晶屏测试小程序
- zabbix Trapper 监控项配置
- poi 读取excel合并单元格两种方式
- Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影系统
- Outlook-VBA-03-收件箱附件处理
- ZLib 解压缩工具
- 今日芯声 | 别乱拍照!多位英国明星iCloud被黑裸照泄露