import java.util.LinkedList;

public class BinaryTree {

    public static void main(String[] args) {
int randoms[] = new int[]{67, 7, 30, 73, 10, 0, 78, 81, 10, 74}; Node roots = new Node();
for (int number : randoms) {
roots.add(number);
} //roots.preorderTraversal1();
//System.out.println();
roots.postorderTraversal2();
}
} class Node {
/**
* 左孩子
*/
public Node lchild; /**
* 右孩子
*/
public Node rchild; /**
* 数据域
*/
public Integer value; /**
* 添加孩子结点
*/
public void add(Integer i) {
if (null == this.value) {
this.value = i;
} else if (i <= this.value) {
if (null == this.lchild) {
lchild = new Node();
}
lchild.add(i);
} else {
if (null == this.rchild) {
rchild = new Node();
}
rchild.add(i);
}
} /**
* 前序遍历(递归版本)
*/
public void preorderTraversal1() { System.out.print(value + " "); if (null != lchild) {
lchild.preorderTraversal1();
} if (null != rchild) {
rchild.preorderTraversal1();
}
} /**
* 前序遍历(非递归版本)
*/
public void preorderTraversal2() {
//用来暂存结点的栈
Stack<Node> nodes = new Stack<Node>();
//获取根节点
Node node = this; //当遍历到最后一个结点时,栈为空,左右结点也为空,则结束遍历
while (node != null || !nodes.isEmpty()) { //先靠左遍历把最左边的打印出来,然后再入栈
while (node != null) {
//当前结点非空则输出值
System.out.print(node.value + " ");
//入栈
nodes.push(node);
//一直寻找他的左结点
node = node.lchild;
} //最左边的一条遍历完了后开始出栈且获取右结点
if (!nodes.isEmpty()) {
node = nodes.pop();
node = node.rchild;
}
}
} /**
* 中序遍历(递归版本)
*/
public void inorderTraversal1() { if (null != lchild) {
lchild.inorderTraversal1();
} System.out.print(value + " "); if (null != rchild) {
rchild.inorderTraversal1();
}
} /**
* 中序遍历(非递归版本)
*/
public void inorderTraversal2() {
//暂存结点的栈
Stack<Node> nodes = new Stack<Node>();
//获取根节点
Node node = this; //当遍历到最后一个结点时,栈为空,左右结点也为空,则结束遍历
while (node != null || !nodes.isEmpty()) {
//先把靠左的结点入栈
while (node != null) {
nodes.push(node);
node = node.lchild;
} //再从末尾的几点开始遍历入栈右子树
if (!nodes.isEmpty()) {
node = nodes.pop();
//打印结点
System.out.print(node.value + " ");
//获取右节点
node = node.rchild;
}
}
} /**
* 后序遍历(递归版本)
*/
public void postorderTraversal1() { if (null != lchild) {
lchild.postorderTraversal1();
} if (null != rchild) {
rchild.postorderTraversal1();
} System.out.print(value + " ");
} /**
* 后序遍历(非递归版本)
*/
public void postorderTraversal2() {
//将结点暂存在栈中
Stack<Node> nodes = new Stack<Node>();
//获取根节点
Node node = this;
Node lastVisit = this; while (node != null || !nodes.isEmpty()) { //先将左侧结点入栈
while (node != null) {
nodes.push(node);
node = node.lchild;
} //先获得栈顶的元素
node = nodes.peek();
if (node.rchild == null || node.rchild == lastVisit) {
System.out.print(node.value + " ");
//访问过了元素,则出栈
nodes.pop();
//标记为访问过了,最后一次访问的
lastVisit = node;
//防止下次循环把已入栈过的元素重复入栈
node = null;
} else {
//如果右边还有子树还没遍历则继续遍历
node = node.rchild;
}
}
} /**
* 层序遍历
*/
public void levelTraversal() {
//使用队列来暂存结点
Queue<Node> nodes = new LinkedList<>();
//获取根节点
Node node = this;
//如果该树为空,则不遍历
if (node != null) {
nodes.offer(node);
} //只要队列不为空,则继续遍历
while (!nodes.isEmpty()) {
//获取队头元素
node = nodes.peek();
//如果该节点的左右子节点都不为空,则加入队列,否则跳过
if (node.lchild != null) {
nodes.offer(node.lchild);
}
if (node.rchild != null) {
nodes.offer(node.rchild);
}
//打印队头元素的数据域的值
System.out.print(node.value + " ");
//队头元素遍历完毕,出队
nodes.poll();
}
}
} class Stack<T> {
private LinkedList<T> stack = new LinkedList<>(); public void push(T t) {
stack.addFirst(t);
} public T pop() {
return stack.removeFirst();
} public T peek() {
return stack.getFirst();
} public boolean isEmpty() {
return stack.isEmpty();
} @Override
public String toString() {
return stack.toString();
}
}

数据结构 - 二叉树的遍历(递归VS非递归)的更多相关文章

  1. 数据结构二叉树的递归与非递归遍历之java,javascript,php实现可编译(1)java

    前一段时间,学习数据结构的各种算法,概念不难理解,只是被C++的指针给弄的犯糊涂,于是用java,web,javascript,分别去实现数据结构的各种算法. 二叉树的遍历,本分享只是以二叉树中的先序 ...

  2. C实现二叉树(模块化集成,遍历的递归与非递归实现)

    C实现二叉树模块化集成 实验源码介绍(源代码的总体介绍):header.h : 头文件链栈,循环队列,二叉树的结构声明和相关函数的声明.LinkStack.c : 链栈的相关操作函数定义.Queue. ...

  3. Java实现二叉树的先序、中序、后序、层序遍历(递归和非递归)

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

  4. 二叉树3种递归和非递归遍历(Java)

    import java.util.Stack; //二叉树3种递归和非递归遍历(Java) public class Traverse { /******************一二进制树的定义*** ...

  5. JAVA递归、非递归遍历二叉树(转)

    原文链接: JAVA递归.非递归遍历二叉树 import java.util.Stack; import java.util.HashMap; public class BinTree { priva ...

  6. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  7. 数据结构作业——图的存储及遍历(邻接矩阵、邻接表+DFS递归、非递归+BFS)

    邻接矩阵存图 /* * @Author: WZY * @School: HPU * @Date: 2018-11-02 18:35:27 * @Last Modified by: WZY * @Las ...

  8. 数据结构-树以及深度、广度优先遍历(递归和非递归,python实现)

    前面我们介绍了队列.堆栈.链表,你亲自动手实践了吗?今天我们来到了树的部分,树在数据结构中是非常重要的一部分,树的应用有很多很多,树的种类也有很多很多,今天我们就先来创建一个普通的树.其他各种各样的树 ...

  9. Java - 二叉树递归与非递归

    树的定义具有递归特性,因此用递归来遍历比较符合特性,但是用非递归方式就比较麻烦,主要是递归和栈的转换. import java.util.Stack; /** * @author 李文浩 * @ver ...

  10. 二叉树之AVL树的平衡实现(递归与非递归)

    这篇文章用来复习AVL的平衡操作,分别会介绍其旋转操作的递归与非递归实现,但是最终带有插入示例的版本会以递归呈现. 下面这张图绘制了需要旋转操作的8种情况.(我要给做这张图的兄弟一个赞)后面会给出这八 ...

随机推荐

  1. shiro入门学习--使用MD5和salt进行加密|练气后期

    写在前面 在上一篇文章<Shiro入门学习---使用自定义Realm完成认证|练气中期>当中,我们学会了使用自定义Realm实现shiro数据源的切换,我们可以切换成从关系数据库如MySQ ...

  2. python中的对文件的读写

    简单的实例 open函数获取文件,w是写权限,可以对文件进行io操作 file=open('C:/Users/Administrator/Desktop/yes.txt','w') file.writ ...

  3. 多测师讲解python_oo1基本操作

    1.什么是Python? Python是一门面向对象,解释型的动态类型的编程语言,有Guido van Rossunm于1989年发明,第一个公开发行版发行于1991年: Guido van Ross ...

  4. MeteoInfoLab脚本示例:FY-2C 云分类HDF数据

    脚本程序: #Add data file fn = 'D:/Temp/hdf/FY2C_CLC_MLT_NOM_20070730_1800.hdf' f = addfile(fn) #Get data ...

  5. day26 Pyhton select功能语句实现

    一.查询语句功能实现 select id,name where age > '20' name_value = {'id':0,'name':1,'age':2,'phone':3,'job': ...

  6. 【C语言/C++编程学习笔记】:通俗易懂讲解 - 链表!学不会?不存在的!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  7. 【迷宫问题】CodeForces 1292A A NEKO's Maze Game

    题目大意 vjudge链接 共两行,从(1,n)到(2,n). 每过一个时刻会有一个位置的状态变化,从能到达这个位置变成不能到达,或从不能到达变成能到达,问在每个时刻中是否能从起点到终点. 数据范围 ...

  8. nginx优化:使用expires在浏览器端缓存静态文件

    一,nginx中expires指令的作用 网站的图片等静态文件一旦发布,通常很少改动, 为了减小对服务器请求的压力,提高用户浏览速度, 我们可以设置nginx中的expires, 使用户访问一次后,将 ...

  9. Linux命令的内部命令执行

    一个命令可能既是内部命令也是外部命令 因为内部命令优先级高,先执行内部命令 [04:21:44 root@C8[ ~]#type -a echo echo is a shell builtin ech ...

  10. 网络爬虫养成记(第一天)——安装Scrapy

    古人云:工欲善其事,必先利其器.在网络爬虫中,Scrapy无疑是一把利器,那么,今天我们来谈谈Scrapy的安装. 幸运的是,Scrapy已经支持Python3.4+了,也就是说,我们可以在pytho ...