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# Redis分布式锁 - 单节点

    为什么要用分布式锁? 先上一张截图,这是在浏览别人的博客时看到的. 在了解为什么要用分布式锁之前,我们应该知道到底什么是分布式锁. 锁按照不同的维度,有多种分类.比如 1.悲观锁,乐观锁; 2.公平锁 ...

  2. 048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例——阶乘的累加和

    048 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 10 案例--阶乘的累加和 本文知识点:通过案例练习嵌套循环应用 案例练习--阶乘的累加和 案例题目 ...

  3. 源码安装IVRE

    简介:IVRE(又名DRUNK)是一款开源的网络侦查框架工具,IVRE使用Nmap.Zmap进行主动网络探测.使用Bro.P0f等进行网络流量被动分析,探测结果存入数据库中,方便数据的查询.分类汇总统 ...

  4. Tensorflow学习笔记No.0

    这里更新一些学习Tensorflow过程中可能用到的实用工具. Jupyter Notebook Jupyter Notebook 是一个非常方便的python编程工具,支持可视化,对于学习pytho ...

  5. Apache HttpClient 4.5 在Springboot中使用

    ConnectionRequestTimeout httpclient使用连接池来管理连接,这个时间就是从连接池获取连接的超时时间,可以想象下数据库连接池 ConnectTimeout 连接建立时间, ...

  6. Github 太狠了,居然把 "master" 干掉了!

    前段时间栈长有看到 Github 和 master 分支变更的新闻,当时没有注意细节,直到今天我创建仓库时: 看了半天感觉有点不对劲啊... 怎么 master 不见了,之前默认主干分支名称都是叫 m ...

  7. Java虚拟机系列——检视阅读

    Java虚拟机系列--检视阅读 参考 java虚拟机系列 入门掌握JVM所有知识点 2020重新出发,JAVA高级,JVM JVM基础系列 从 0 开始带你成为JVM实战高手 Java虚拟机-垃圾收集 ...

  8. 每日一题 LeetCode 42.接雨水 【双指针】

    题目链接 https://leetcode-cn.com/problems/trapping-rain-water/ 题目说明 题解 主要方法:双指针 + 正反遍历 解释说明: 正向遍历:先确定池子左 ...

  9. day55 Pyhton 前端Jquery07

    昨日回顾: 表单,点击submit提交以后,服务端受到信息 import socket import pymysql from urllib.parse import unquote def run( ...

  10. 【Luogu】P3005 [USACO10DEC]槽的游戏The Trough Game

    一.题目 题目描述 农夫约翰和贝西又在玩游戏.这个游戏需要很多个槽. 农夫约翰在谷仓里藏起来了N(1<=N<=20)个槽,并且他已经把其中的一些装上了食物.贝西以"在这个表里(表 ...