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. Layman 使用ffmpeg-php扩展库实现视频截图(默认图)

    这几天做项目,其中一个需求是用户上传视频文件到服务器,然后服务器自动截取该视频的一帧作为该视频对应的缩略图,服务器端语言采用php编写,找了半天资料,发现ffmpeg-php可以满足该需求,所以下面简 ...

  2. linux 漏洞列表

    #CVE #Description #Kernels CVE-2017-1000367 [Sudo](Sudo 1.8.6p7 - 1.8.20) CVE-2017-7494 [Samba Remot ...

  3. matlab中upper 将字符串转换为大写

    参考:https://ww2.mathworks.cn/help/matlab/ref/fprintf.html?searchHighlight=fprintf&s_tid=doc_srcht ...

  4. Linux系统编程 —共享内存之mmap

    共享内存概念 共享内存是通信效率最高的IPC方式,因为进程可以直接读写内存,而无需进行数据的拷备.但是它没有自带同步机制,需要配合信号量等方式来进行同步. 共享内存被创建以后,同一块物理内存被映射到了 ...

  5. 为自己的网页博客添加L2Dwidget.js看板娘

    如果是博客园,直接在设置-->页脚 HTML 代码,加上下面代码: 1 <!-- L2Dwidget.js L2D网页动画人物 --> 2 <script src=" ...

  6. [BJWC 2011]元素

    题目大意: 你有n个二元组(x,y),要求从中任取几个,使得x的值亦或起来不为0,且y之和最大. 题解: 显然是以x来构造线性基的,然而加入元素的个数是有限制的,那当然就是大的先来喽,排个序就OK啦! ...

  7. 【基线检查】(高)基线检查--禁用local-infile选项(访问控制)

    (高)基线检查--禁用local-infile选项(访问控制) 描述 禁用local_infile选项会降低攻击者通过SQL注入漏洞器读取敏感文件的能力 检查提示 -- 加固建议 编辑Mysql配置文 ...

  8. 利用HDFS实现ElasticSearch7.2容灾方案

    利用HDFS实现ElasticSearch7.2容灾方案 目录 利用HDFS实现ElasticSearch7.2容灾方案 前言 快照版本兼容 备份集群 HDFS文件系统 软件下载 JDK环境 配置系统 ...

  9. 多测师讲解python函数 _open_高级讲师肖sir

    open()函数 #open() 函数用于打开一个文件,创建一个 file 对象 #Python open() 函数用于打开一个文件,并返回文件对象, # 在对文件进行处理过程都需要使用到这个函数,如 ...

  10. day14 Pyhton学习

    一.迭代器-概念 可迭代协议:内部含有__iter__方法的值/变量都是可迭代的 如何得到一个迭代器:可迭代变量.__iter__()返回一个迭代器 迭代器协议:内部含有__iter__方法和__ne ...