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. 在C++中使用libuv时对回调的处理

    新的解决方法 https://www.cnblogs.com/ink19/p/13768425.html libuv简介 libuv是一个可以跨平台的C语言库,它提供了基于事件的异步IO支持[1].提 ...

  2. Python-joypy和 R-ggridges 峰峦图制作

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 以下文章来源于DataCharm,作者 宁海涛 转载地址 https://www ...

  3. 在 Visual Studio 中创建一个简单的 C# 控制台应用程序

    转载:https://blog.csdn.net/qq_43994242/article/details/87260824 快速入门:使用 Visual Studio 创建第一个 C# 控制台应用 h ...

  4. I2C 方式

    转自:http://www.cnblogs.com/lucky-apple/archive/2008/07/03/1234581.html 区别: SPI:高速同步串行口.3-4线接口,收发独立.可同 ...

  5. pycharm 解决PEP8问题,配置autopep8到菜单栏

    autopep8是一个可以将Python代码自动排版为PEP8风格第三方包,使用它可以轻松地排版出格式优美整齐的代码.网络上有很多介绍如何在pycharm中配置autopep8的方案,但很多方案中还是 ...

  6. 手把手教你AspNetCore WebApi:Serilog(日志)

    前言 小明目前已经把"待办事项"功能实现了,API文档也搞定了,但是马老板说过,绝对不能让没有任何监控的项目上线的. Serilog是什么? 在.NET使用日志框架第一时间会想到N ...

  7. 几个常用markdown工具的主要优缺点

    几个常用markdown工具的主要优缺点 最近对几个热门的markdown工具做了一个对比表 表格 脚注 图片和图床 平台 移动端 实时预览 收费 操作难度 导出功能 mweb 非常棒 预览正常显示 ...

  8. 远程触发Jenkins的Pipeline任务的并发问题处理

    前文概述 本文是<远程触发Jenkins的pipeline任务>的续篇,上一篇文章实战了如何通过Http请求远程触发指定的Jenkins任务,并且将参数传递给Jenkins任务去使用,文末 ...

  9. shell-整数测试多范例多生产案例举例

    1. 整数测试举例范例1:整数条件测试举例 root@test-1 ~]# a1=10;a2=13 [root@test-1 ~]# echo $a1 $a2 10 13 [root@test-1 ~ ...

  10. devops工具链概述

    1. devops工具链概述  1)devops工具篇 2) 持续集成 3) 持续交付 4) 持续部署 2. devops工具链概述