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数据结构之二叉树遍历的非递归实现
算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...
随机推荐
- 【03】HTML head 头部分的标签说明 和 手机头部标签说明
HTML head 头部分的标签.元素有很多,涉及到浏览器对网页的渲染,SEO 等等,而各个浏览器内核以及各个国内浏览器厂商都有些自己的标签元素,这就造成了很多差异性.移动互联网时代,head 头部结 ...
- js用for...in 这种遍历的方式
var arr = new Array("first", "second", "third") for(var item in arr) { ...
- Codeforces Round #372 (Div. 2) A .Crazy Computer/B. Complete the Word
Codeforces Round #372 (Div. 2) 不知不觉自己怎么变的这么水了,几百年前做A.B的水平,现在依旧停留在A.B水平.甚至B题还不会做.难道是带着一种功利性的态度患得患失?总共 ...
- 【BZOJ1758】重建计划(点分治)
题意: 给定一棵n个点的树,每条边有权值.求一条链,这条链包含的边数在L和U之间,且平均边权最大.N﹤=100000 思路:RYZ作业 二分答案再点分治,寻找是否有大于0且边数在L和U之间的链 f[i ...
- 可并堆试水--BZOJ1367: [Baltic2004]sequence
n<=1e6个数,把他们修改成递增序列需把每个数增加或减少的总量最小是多少? 方法一:可以证明最后修改的每个数一定是原序列中的数!于是$n^2$DP(逃) 方法二:把$A_i$改成$A_i-i$ ...
- Android定位(是否使用GPS进行定位)
TencentLocationRequest request = TencentLocationRequest.create(); request.setRequestLevel(TencentLoc ...
- CALayer之 customizing timing of an animation
customizing timing of an animation Timing is an important part of animations, and with Core Animatio ...
- JavaScript面向对象实现
JavaScript面向对象实现 一:面向对象三大特征 继承,封装,多态! 二:JavaScript自定义对象 创建对象的方式: 方式1,对象初始化器方式: <script type=&quo ...
- cogs——1364. 聚会
1364. 聚会 ★ 输入文件:partyb.in 输出文件:partyb.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 小S想要从某地出发去同学k的家中参加 ...
- 命令行man的帮助手册
http://blog.csdn.net/gatieme/article/details/51656707 指定使用那种语音的手册,可以使用命令选项-M man -M /usr/share/man/z ...