Java实现二叉树遍历
参考资料:
http://blog.csdn.net/wuwenxiang91322/article/details/12231657
环境:
Java: jdk1.8.0_91
import java.util.Stack;
public class BinaryTreeTest {
/**
* 树结构如下:
* root
* / \
* A B
* / \ \
* C D G
* / / / \
* E F H I
*
*/
public static void main(String[] args) {
Node root = new Node("root");
Node A = new Node("A"), B = new Node("B"), C = new Node("C"), D = new Node("D"), E = new Node("E"),
F = new Node("F"), G = new Node("G"), H = new Node("H"), I = new Node("I");
root.setLeft(A);
A.setLeft(C);
A.setRight(D);
C.setLeft(E);
D.setLeft(F);
root.setRight(B);
B.setRight(G);
G.setLeft(H);
G.setRight(I);
BinaryTreeTraversalor tree = BinaryTreeTraversalor.PRE_ORDER;
System.out.print(String.format("%s->", tree.getStrategy()));
tree.execute(root);
tree = BinaryTreeTraversalor.IN_ORDER;
System.out.print(String.format("\n%s->", tree.getStrategy()));
tree.execute(root);
tree = BinaryTreeTraversalor.POST_ORDER;
System.out.print(String.format("\n%s->", tree.getStrategy()));
tree.execute(root);
tree = BinaryTreeTraversalor.PRE_ORDER_NORECU;
System.out.print(String.format("\n%s->", tree.getStrategy()));
tree.execute(root);
tree = BinaryTreeTraversalor.IN_ORDER_NORECU;
System.out.print(String.format("\n%s->", tree.getStrategy()));
tree.execute(root);
tree = BinaryTreeTraversalor.POST_ORDER_NORECU;
System.out.print(String.format("\n%s->", tree.getStrategy()));
tree.execute(root);
}
}
class Node {
private String value;
private Node left;
private Node right;
public Node(String value) {
this.value = value;
}
public String getValue() {
return value;
}
public Node getLeft() {
return left;
}
public void setLeft(Node left) {
this.left = left;
}
public Node getRight() {
return right;
}
public void setRight(Node right) {
this.right = right;
}
}
enum BinaryTreeTraversalor {
IN_ORDER("递归中序遍历") {
@Override
public void execute(Node node) {
if (node != null) {
execute(node.getLeft());
visit(node);
execute(node.getRight());
}
}
},
PRE_ORDER("递归先序遍历") {
@Override
public void execute(Node node) {
if (node != null) {
visit(node);
execute(node.getLeft());
execute(node.getRight());
}
}
},
POST_ORDER("递归后序遍历") {
@Override
public void execute(Node node) {
if (node != null) {
execute(node.getLeft());
execute(node.getRight());
visit(node);
}
}
},
IN_ORDER_NORECU("非递归中序遍历") {
@Override
public void execute(Node node) {
final Stack<Node> stack = new Stack<>();
while (node != null || !stack.isEmpty()) {
while (node != null) {
stack.push(node);
node = node.getLeft();
}
if (stack.size() > 0) {
node = stack.pop();
visit(node);
node = node.getRight();
}
}
}
},
PRE_ORDER_NORECU("非递归先序遍历") {
@Override
public void execute(Node node) {
final Stack<Node> stack = new Stack<>();
while (node != null || !stack.isEmpty()) {
while (node != null) {
visit(node);
stack.push(node);
node = node.getLeft();
}
if (stack.size() > 0) {
node = stack.pop();
node = node.getRight();
}
}
}
},
POST_ORDER_NORECU("非递归后序遍历") {// 需要重点理解
@Override
public void execute(Node node) {
final Stack<Node> stack = new Stack<>();
Node tmp = null;
while (node != null) {
while (node.getLeft() != null) {
stack.push(node);
node = node.getLeft();
}
while (node != null && (node.getRight() == null || node.getRight() == tmp)) {// 当前结点无右子树或右子树已经输出
visit(node);
// 记录上一个已输出结点
tmp = node;
if (stack.empty())
return;
node = stack.pop();
}
stack.push(node);
node = node.getRight();
}
}
};
private static void visit(Node root) {
System.out.print(root.getValue() + "\t");
}
private String strategy;
BinaryTreeTraversalor(String strategy) {
this.strategy = strategy;
}
public abstract void execute(Node node);
public String getStrategy() {
return strategy;
}
}
Java实现二叉树遍历的更多相关文章
- Java实现二叉树的创建和遍历操作(有更新)
博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...
- JAVA实现二叉树(简易版--实现了二叉树的各种遍历)
1,个人感觉二叉树的实现主要还是如何构造一颗二叉树.构造二叉树函数的设计方法多种多样,本例采用 addNode 方法实现.以下程序通过定义内部类来表示二叉树的结点,然后再实现了二叉树这种数据结构的一些 ...
- java 二叉树遍历
package com.lever; import java.util.LinkedList;import java.util.Queue; /** * 二叉树遍历 * @author lckxxy ...
- java创建二叉树并实现非递归中序遍历二叉树
java创建二叉树并递归遍历二叉树前面已有讲解:http://www.cnblogs.com/lixiaolun/p/4658659.html. 在此基础上添加了非递归中序遍历二叉树: 二叉树类的代码 ...
- Java实现二叉树及相关遍历方式
Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...
- 二叉树遍历(Java实现)
二叉树遍历(Java实现) 主要是二叉树的遍历,包括递归遍历和非递归遍历 import java.util.ArrayDeque; import java.util.ArrayList; impo ...
- java实现二叉树的Node节点定义手撕8种遍历(一遍过)
java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...
- Java实现二叉树先序,中序,后序,层次遍历
一.以下是我要解析的一个二叉树的模型形状.本文实现了以下方式的遍历: 1.用递归的方法实现了前序.中序.后序的遍历: 2.利用队列的方法实现层次遍历: 3.用堆栈的方法实现前序.中序.后序的遍历. . ...
- java数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
随机推荐
- Qt Widgets Application可执行程序发布方式
前言 写好的Qt程序想打包发布,之前按照Qt快速入门系列教程里的方法,直接选release,构建,之后找到exe,拷贝几个dll,然而报错如图: 后来找到教程:http://tieba.baidu.c ...
- bzoj 1049 [HAOI2006]数字序列
[bzoj1049][HAOI2006]数字序列 Description 现在我们有一个长度为n的整数序列A.但是它太不好看了,于是我们希望把它变成一个单调严格上升的序列.但是不希望改变过多的数,也不 ...
- openjudge1944 吃糖果
描述名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0).妈妈告诉名名每天可以吃一块或者两块巧克力.假设名名每天都吃巧克力,问名名共有多 ...
- hdu - 1072 Nightmare(bfs)
http://acm.hdu.edu.cn/showproblem.php?pid=1072 遇到Bomb-Reset-Equipment的时候除了时间恢复之外,必须把这个点做标记不能再走,不然可能造 ...
- 洛谷——P1062 数列
洛谷——P1062 数列 题目描述 给定一个正整数k(3≤k≤15),把所有k的方幂及所有有限个互不相等的k的方幂之和构成一个递增的序列,例如,当k=3时,这个序列是: 1,3,4,9,10,12,1 ...
- js下载
下载用ajax不好使,得用表单提交的方式 download:function(url,paramObj){ var doc = document; //使用一个隐藏的form表单执行提交,没有则创建 ...
- 微信JSSDK使用指南
这篇文章主要来说说微信JSSDK的一些配置和微信分享的使用,包括从前端sdk文件引入到server端和微信server的交互. 另外Tangide已经把一些工作做好了.我会简要说一说怎么把它用 ...
- ASP.NET Boilerplate 学习 AspNet Core2 浏览器缓存使用 c#基础,单线程,跨线程访问和线程带参数 wpf 禁用启用webbroswer右键菜单 EF Core 2.0使用MsSql/MySql实现DB First和Code First ASP.NET Core部署到Windows IIS QRCode.js:使用 JavaScript 生成
ASP.NET Boilerplate 学习 1.在http://www.aspnetboilerplate.com/Templates 网站下载ABP模版 2.解压后打开解决方案,解决方案目录: ...
- python 简单连接mysql数据库
1. 安装pymysql 库 pip install pymysql 2.实例本地连接mysql库 #!/usr/bin/python # encoding: utf-8 ""&q ...
- union关键字及大小端模式
1. union 关键字 union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在 union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据成员,所有 ...