参考资料:

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. JavaScript学习---简易图片轮播

    效果如下: 图片定时轮播 点击左右控制显示下一张或上一张图片 index.html文件 <html> <head> <title> js编写实现幻灯片效果 < ...

  2. 算法(1):查找&排序

    算法(Algorithm):一个计算过程,解决问题的方法 程序 = 数据结构+算法 时间复杂度: 当算法过程中出现循环折半的时候,复杂度式子中会出现 O(logn) 时间复杂度小结: 1. 时间复杂度 ...

  3. Linux下汇编语言学习笔记12 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  4. [bzoj1112][POI2008]砖块Klo_非旋转Treap

    砖块Klo bzoj-1112 POI-2008 题目大意:$N$柱砖,希望有连续$K$柱的高度是一样的. 你可以选择以下两个动作 1:从某柱砖的顶端拿一块砖出来,丢掉不要了. 2:从仓库中拿出一块砖 ...

  5. Java并发包——线程通信

    Java并发包——线程通信 摘要:本文主要学习了Java并发包里有关线程通信的一些知识. 部分内容来自以下博客: https://www.cnblogs.com/skywang12345/p/3496 ...

  6. Ubuntu 16.04出现:"Failed to start /etc/rc.local Compatibility"的问题解决思路

    "Failed to start /etc/rc.local Compatibility"这个错误没有最终解决方法,之后思路,如下: 1.打开/etc/rc.local看是否有其它 ...

  7. 测试使用markdonw写博客

    # 欢迎使用 Cmd Markdown 编辑阅读器 ------ 我们理解您需要更便捷更高效的工具记录思想,整理笔记.知识,并将其中承载的价值传播给他人,**Cmd Markdown** 是我们给出的 ...

  8. java代码判断文件类型(判断文件后缀名)

    1.两点需要注意 1.string.spilt("\\.")分割字符串成子字符串数组,以“.”分割,必须写成string.spilt("\\.")的方式,不能写 ...

  9. 015 WAN

    Router#config t Enter configuration commands, one per line.  End with CNTL/Z. Router(config)#int s0/ ...

  10. clamav完整查杀linux病毒实战(摘抄)

    http://dadloveu.blog.51cto.com/blog/715500/1882521 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,L ...