参考资料:

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实现二叉树遍历的更多相关文章

  1. Java实现二叉树的创建和遍历操作(有更新)

    博主强烈建议跳过分割线前面的部分,直接看下文更新的那些即可. 最近在学习二叉树的相关知识,一开始真的是毫无头绪.本来学的是C++二叉树,但苦于编译器老是出故障,于是就转用Java来实现二叉树的操作.但 ...

  2. JAVA实现二叉树(简易版--实现了二叉树的各种遍历)

    1,个人感觉二叉树的实现主要还是如何构造一颗二叉树.构造二叉树函数的设计方法多种多样,本例采用 addNode 方法实现.以下程序通过定义内部类来表示二叉树的结点,然后再实现了二叉树这种数据结构的一些 ...

  3. java 二叉树遍历

    package com.lever; import java.util.LinkedList;import java.util.Queue; /** * 二叉树遍历 * @author lckxxy ...

  4. java创建二叉树并实现非递归中序遍历二叉树

    java创建二叉树并递归遍历二叉树前面已有讲解:http://www.cnblogs.com/lixiaolun/p/4658659.html. 在此基础上添加了非递归中序遍历二叉树: 二叉树类的代码 ...

  5. Java实现二叉树及相关遍历方式

    Java实现二叉树及相关遍历方式 在计算机科学中.二叉树是每一个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(r ...

  6. 二叉树遍历(Java实现)

    二叉树遍历(Java实现)   主要是二叉树的遍历,包括递归遍历和非递归遍历 import java.util.ArrayDeque; import java.util.ArrayList; impo ...

  7. java实现二叉树的Node节点定义手撕8种遍历(一遍过)

    java实现二叉树的Node节点定义手撕8种遍历(一遍过) 用java的思想和程序从最基本的怎么将一个int型的数组变成Node树状结构说起,再到递归前序遍历,递归中序遍历,递归后序遍历,非递归前序遍 ...

  8. Java实现二叉树先序,中序,后序,层次遍历

    一.以下是我要解析的一个二叉树的模型形状.本文实现了以下方式的遍历: 1.用递归的方法实现了前序.中序.后序的遍历: 2.利用队列的方法实现层次遍历: 3.用堆栈的方法实现前序.中序.后序的遍历. . ...

  9. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

随机推荐

  1. ICPC模板排版工具

    感谢参考:https://www.cnblogs.com/palayutm/p/6444833.html 额外安装texlive, ubuntu环境提供参考: 1.下载镜像包 https://mirr ...

  2. 全文检索(AB-1)-相关领域

    信息检索 认知科学 管理科学

  3. 完美解决了span的宽度设置

    下 面代码的CSS定义完美解决了span的宽度设置问题.由于浏览器通常对不支持的CSS属性采取忽略处理的态度,所以最好将display:inline -block行写在后面,这样在Firefox里面, ...

  4. 在docker下面安装Nginx PHP mysql let's encrypt

    最近自己在弄了个Nginx PHP Mysql Let's encrypt的docker,下面记录一下 1)先装 Let's encrypt docker run --rm -p 80:80 -p 4 ...

  5. Automation 的 Wait 工具

    public static WebDriverWait createWait(WebDriver driver) { return new WebDriverWait(driver, Environm ...

  6. HDU1755

    这道题直接暴力枚举复杂度为 n!*m 但是k<100 , 所以我们可以通过取模用dp[i][j] 表示k=i 时,-x取模k为j的最小值 #include <cstdio> #inc ...

  7. idea使用之maven中央仓库索引更新

    接着上篇,上篇是更新本地已有的索引,这样在编写pom文件的时候,可以自动提示,但如果我们能够把整个中央仓库的索引更新下来,那不是更方便啦. 打开settings-->Build,Executio ...

  8. hnuun 11544 小明的烦恼——找字符串(求环形字符串的最小最大字典序)

    http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=11544&courseid=0 最小最大表示法: 求环 ...

  9. Rikka with Phi 线段树

    Chosen Problem Solving and Program design as an optional course, you are required to solve all kinds ...

  10. 2017-10-01-morning

    T1 位运算1(bit) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK拥有一个十进制的数N.它赋予了N一个新的意义:将N每一位都拆开来后再加起来就是N ...