class MyBinaryTree<T> {
BinaryNode<T> root; public MyBinaryTree() {
root = new BinaryNode<>();
} /**
* 堆栈进行先序遍历
*
* @param ts
*/
public void preorderTraversal(T... ts) {
Stack<BinaryNode<T>> binaryStack = new Stack<>();
BinaryNode<T> temp = root;
while (!binaryStack.isEmpty() || temp != null) {
if (temp != null) {
// 处理
System.out.println(temp.data);
// 先序
if (temp != null) {
binaryStack.push(temp);
}
temp = temp.left;
} else {
temp = binaryStack.pop();
temp = temp.right != null ? temp.right : null;
}
}
} /**
* 堆栈中序遍历
*
* @param ts
*/
public void inorderTraversal(T... ts) {
Stack<BinaryNode<T>> binaryStack = new Stack<>();
BinaryNode<T> temp = root;
while (!binaryStack.isEmpty() || temp != null) {
if (temp != null) {
binaryStack.push(temp);
temp = temp.left;
} else {
temp = binaryStack.pop();
// 处理
System.out.println(temp.data);
temp = temp.right != null ? temp.right : null;
}
}
} /**
* 堆栈后序遍历
*
* @param ts
*/
public void postorderTraversal(T... ts) {
Stack<BinaryNode<T>> binaryStack = new Stack<>();
BinaryNode<T> temp = root;
BinaryNode<T> node = null;
while (!binaryStack.isEmpty() || temp != null) {
if (temp != null) {
binaryStack.push(temp);
temp = temp.left;
} else {
temp = binaryStack.pop();
if (temp.right == null || temp.right == node) {
// 处理
System.out.println(temp.data);
node = temp;
temp = null;
} else {
binaryStack.push(temp);
temp = temp.right;
binaryStack.push(temp);
temp = temp.left;
}
}
}
} /**
* 层级遍历
*/
public void levelTraversal() {
BinaryNode<T> temp = root;
Queue<BinaryNode<T>> queue = new LinkedList<>();
queue.add(temp);
while(!queue.isEmpty()) {
temp = queue.poll();
       // 处理
System.out.println(temp.data);
if(temp.left!=null) {
queue.add(temp.left);
}
if(temp.right!=null) {
queue.add(temp.right);
}
}
}
} class BinaryNode<T> {
BinaryNode<T> left;
T data;
BinaryNode<T> right; public BinaryNode() {
} public BinaryNode(BinaryNode<T> left, T data, BinaryNode<T> right) {
this.left = left;
this.data = data;
this.right = right;
}
}

测试代码:

    private MyBinaryTree<String> binaryTree;

    @Before
public void setUp() {
binaryTree = new MyBinaryTree<>();
binaryTree.root.data = "A";
binaryTree.root.left = new BinaryNode<>(new BinaryNode<>(null, "D", null), "B", null);
binaryTree.root.right = new BinaryNode<>(new BinaryNode<>(null, "F", null), "C",
new BinaryNode<>(null, "E", null));
} @Test
public void preorderTest() {
binaryTree.preorderTraversal();
System.out.println("---------------先序遍历------------------");
} @Test
public void inorderTest() {
binaryTree.inorderTraversal();
System.out.println("---------------中序遍历------------------");
} @Test
public void postorderTest() {
binaryTree.postorderTraversal();
System.out.println("---------------后序遍历------------------");
} @Test
public void levelTest() {
binaryTree.levelTraversal();
System.out.println("---------------层级遍历------------------");
}

Java 非递归实现 二叉树的前中后遍历以及层级遍历的更多相关文章

  1. Java非递归的方式获取目录中所有文件(包括目录)

    零.思路解析 对于给出的文件查看其下面的所有目录,将这个目录下的所有目录放入待遍历的目录集合中,每次取出该集合中的目录遍历,如果是目录再次放入该目录中进行遍历. 一.代码 /** * 非递归的方式获取 ...

  2. Qt实现 动态化遍历二叉树(前中后层次遍历)

    binarytree.h 头文件 #ifndef LINKEDBINARYTREE_H #define LINKEDBINARYTREE_H #include<c++/algorithm> ...

  3. java实现二叉树的前中后遍历(递归和非递归)

    这里使用下图的二叉树作为例子: 首先建立树这个类: public class Node { private int data; private Node leftNode; private Node ...

  4. POJ 2255 Tree Recovery && Ulm Local 1997 Tree Recovery (二叉树的前中后序遍历)

    链接:poj.org/problem?id=2255 本文链接:http://www.cnblogs.com/Ash-ly/p/5463375.html 题意: 分别给你一个二叉树的前序遍历序列和中序 ...

  5. Binary Tree Traversal 二叉树的前中后序遍历

    [抄题]:二叉树前序遍历 [思维问题]: 不会递归.三要素:下定义.拆分问题(eg root-root.left).终止条件 [一句话思路]: 节点非空时往左移,否则新取一个点 再往右移. [输入量] ...

  6. 数据结构-C语言递归实现树的前中后序遍历

    #include <stdio.h> #include <stdlib.h> typedef struct tree { int number ; struct tree *l ...

  7. 五二不休息,今天也学习,从JS执行栈角度图解递归以及二叉树的前、中、后遍历的底层差异

    壹 ❀ 引 想必凡是接触过二叉树算法的同学,在刚上手那会,一定都经历过题目无从下手,甚至连题解都看不懂的痛苦.由于leetcode不方便调试,题目做错了也不知道错在哪里,最后无奈的cv答案后心里还不断 ...

  8. 二叉树前中后/层次遍历的递归与非递归形式(c++)

    /* 二叉树前中后/层次遍历的递归与非递归形式 */ //*************** void preOrder1(BinaryTreeNode* pRoot) { if(pRoot==NULL) ...

  9. [C++] 非递归实现前中后序遍历二叉树

    目录 前置技能 需求描述 binarytree.h 具体实现 binarytree.cpp main.cpp 网上代码一搜一大片,大同小异咯. 书上的函数实现代码甚至更胜一筹,而且抄一遍就能用,唯一问 ...

随机推荐

  1. java 大数运算[转]

    用JAVA 实现算术表达式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因为JAVA语言中的long 定义的变量值的最大数受到限制,例如 ...

  2. webpack学习笔记(五)

    1. 如果想编写一个libray的库,代码结构如下: -library -src -index.js -math.js -string.js math.js export function add(a ...

  3. 使用nginx mirror 制作nexus 的简单ha

      主要是运行两台nexus 机器,通过nexus 的host 以及proxy 以及public 模型,结合nginx 的mirror 将对于host 的get 请求 mirror 到另一台机器pro ...

  4. Asp.Net : Page.RegisterStartupScript及 不执行的原因

    RegisterStartupScript 把script放置在ASP.NET page的底部,而RegisterClientScriptBlock把script放置在ASP.NET page的顶部 ...

  5. 位(bit)、字节(byte)、字符、编码之间的关系

    1.位: 数据存储的最小单位.每个二进制数字0或者1就是1个位: 2.字节: 8个位构成一个字节:即:1 byte (字节)= 8 bit(位): 1 KB = 1024 B(字节): 1 MB = ...

  6. 利用R与SAS进行关联规则挖掘

    一.利用R进行关联规则挖掘 数据结构如下: (共9个itemsets,5个items) 首先读入数据: demodata = read.transactions("C:\\Documents ...

  7. 【Oracle】group by 和partition by的区别

    总结: group 单纯分组 partition 也能分组,但还具备累计的功能 order by 排序,与计算函数联用,需要累加计算 0.select * from test;     ---测试数据 ...

  8. C# 如何获取SQL Server 中指定数据表的所有字段名和字段类型

    如何获取指定数据表的所有字段名和字段类型.SqlConnection.GetSchema方法有2个重载形式,获取指定数据表的所有字段名和字段类型的秘密就在GetSchema (String, Stri ...

  9. Vue.js中ref ($refs)用法举例总结

    原文地址:http://www.cnblogs.com/xueweijie/p/6907676.html <div id="app"> <input type=& ...

  10. Apache Atlas元数据管理从入门到实战(1)

    一.前言   元数据管理是数据治理非常重要的一个方向,元数据的一致性,可追溯性,是实现数据治理非常重要的一个环节.传统数据情况下,有过多种相对成熟的元数据管理工具,而大数据时代,基于hadoop,最为 ...