直接上代码呵呵,里面有注解

package www.com.leetcode.specificProblem;

import java.util.ArrayList;
import java.util.List;
import java.util.Stack; /**
* 总结了三种非递归遍历二叉树
* @author 85060
*
*/
public class TraverseBinaryTree { //用来装遍历序列的一个list,展示的时候用
private List<TreeNode> helpList = new ArrayList<>(); public static void main(String[] args) {
TreeNode root = createATree();
TraverseBinaryTree traverseBinaryTree = new TraverseBinaryTree(); //traverseBinaryTree.frontTraverseRecursion(root);
//traverseBinaryTree.midTraverseRecursion(root);
traverseBinaryTree.backTraverseRecursion(root);
String rightAnswer = traverseBinaryTree.helpList.toString();
System.out.println("right: " + rightAnswer); traverseBinaryTree.helpList.clear(); //traverseBinaryTree.frontTravese(root);
//traverseBinaryTree.midTraverse(root);
traverseBinaryTree.backTraverse(root);
String myAnswer = traverseBinaryTree.helpList.toString();
System.out.println("my ans: " + myAnswer);
System.out.println("bingo? " + rightAnswer.equals(myAnswer)); } /**
* 递归版的前序遍历二叉树
* @param node
*/
private void frontTraverseRecursion(TreeNode node) {
if(node == null)return;
helpList.add(node);
frontTraverseRecursion(node.left);
frontTraverseRecursion(node.right);
} /**
* 递归式的中序递归二叉树
* @param node
*/
private void midTraverseRecursion(TreeNode node) {
if(node == null)return;
midTraverseRecursion(node.left);
helpList.add(node);
midTraverseRecursion(node.right);
} /**
* 递归式的后序遍历二叉树
* @param node
*/
private void backTraverseRecursion(TreeNode node) {
if(node == null)return;
backTraverseRecursion(node.left);
backTraverseRecursion(node.right);
helpList.add(node);
} /**
* 非递归的前序遍历二叉树
* 用一个node,一直往左遍历,一边遍历一边入栈,当走到左边的尽头后,就出栈,然后去这个出栈元素的右子树,继续循环
* @param root
*/
private void frontTravese(TreeNode root) {
if(root == null)return;
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root; while(node != null || !stack.isEmpty()) {
if(node != null) {
helpList.add(node);//visit
stack.push(node);
node = node.left;
} else {
//左子树没了,进入栈中然后去右子树咯
node = stack.pop().right;
}
}
} /**
* 非递归式的中序递归二叉树
* @param root
*/
private void midTraverse(TreeNode root) {
if(root == null)return ; Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root; while(node != null || !stack.isEmpty()) { while(node != null) {//一直往左走到尽头
stack.push(node);
node = node.left;
}
if(!stack.isEmpty()) {
node = stack.pop();
helpList.add(node);//visit
node = node.right;//进入右子树
}
} } /**
* 非递归的后序遍历二叉树
* 后序遍历的关键就是要判断上一个结点的右孩子访问了没,所以要存上次访问的结点
* @param root
*/
private void backTraverse(TreeNode root) {
if(root == null)return; Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
TreeNode lastVisit = null;//记录刚刚访问过的那个结点,用来区分stack中pop出来的结点的右子树访问过没 while(node != null || !stack.isEmpty()) {
while(node != null) {//一直走到树的最左边,stack是最左边的那个叶子结点
stack.push(node);
node = node.left;
} while(!stack.isEmpty()) {
node = stack.peek();
if(node.right == null || node.right == lastVisit) {//没有右子树,右子树访问过了,都可以访问这个结点了
helpList.add(node);//visit
//System.out.println(node);
lastVisit = node;
stack.pop();
if(stack.isEmpty())return;//这个很重要,不然会无限循环
} else {//右子树不为空,而且没访问过
node = node.right;
break;//出去要走到这个右子树的最左边噢
}
}
} } /**
* 构造一颗测试用的二叉树数据
* @return
*/
private static TreeNode createATree() { TreeNode root = new TreeNode(4);
root.left = new TreeNode(3);
root.right = new TreeNode(6);
root.left.left = new TreeNode(11);
root.left.right = new TreeNode(12);
root.left.right.left = new TreeNode(45);
root.right.left = new TreeNode(13);
root.right.right = new TreeNode(14);
root.right.right.right = new TreeNode(32); return root; }
} /**
* 二叉树结点类
* @author 85060
*
*/
class TreeNode {
int data;
TreeNode left;
TreeNode right; public TreeNode(int data) {
this.data = data;
} @Override
public String toString() {
// TODO Auto-generated method stub
return data + "";
}
}

非递归遍历二叉树Java版的实现代码(没写层次遍历)的更多相关文章

  1. java版第一个代码——HelloWorld!

    java版第一个代码--HelloWorld! 今天来接触一下java代码: 事前准备 jdk的配置(推荐jdk8或jdk11) notepad++或idea软件 开始编写 建立文件夹存放代码 建立j ...

  2. 非递归遍历二叉树Java实现

    2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...

  3. 手写二叉树-先序构造(泛型)-层序遍历(Java版)

    如题 先序构造 数据类型使用了泛型,在后续的更改中,更换数据类型只需要少许的变更代码 层序遍历 利用Node类的level属性 所有属性的权限全为public ,为了方便先这么写吧,建议还是用priv ...

  4. 非递归实现二叉树的三种遍历操作,C++描述

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  5. c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历

    #include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...

  6. Python非递归实现二叉树的后续遍历

    leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...

  7. 非递归创建二叉树( C++队列 )

    非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...

  8. C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)

    今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...

  9. Java 非递归实现 二叉树的前中后遍历以及层级遍历

    class MyBinaryTree<T> { BinaryNode<T> root; public MyBinaryTree() { root = new BinaryNod ...

随机推荐

  1. Excel对重复数据分组,求出不同的数据(office 2013)

    第一步: 第二步: 第三步:

  2. EventLoop 与 Channel 的关联

    Netty 中, 每个 Channel 都有且仅有一个 EventLoop 与之关联, 它们的关联过程如下: 从上图中我们可以看到, 当调用了 AbstractChannel#AbstractUnsa ...

  3. Less:Less(CSS预处理语言)

    ylbtech-Less:Less(CSS预处理语言) Less 是一门 CSS 预处理语言,它扩充了 CSS 语言,增加了诸如变量.混合(mixin).函数等功能,让 CSS 更易维护.方便制作主题 ...

  4. [原创]SQL表值函数:把用逗号分隔的字符串转换成表格数据

      我们日常开发过程中,非常常见的一种需求,把某一个用逗号或者/或者其他符号作为间隔的字符串分隔成一张表数据. 在前面我们介绍了 [原创]SQL 把表中字段存储的逗号隔开内容转换成列表形式,当然按照这 ...

  5. 深入了解 Cloud Studio 开发在云端

    Cloud Studio 为开发者提供了一个永不间断的云端工作站,不管有没有开发经验都可以毫无门槛的体验云端开发的乐趣,支持绝大部分编程语言.Cloud Studio 提供了完整的 Linux 环境, ...

  6. 我的windows软件

    1.360安全卫士 http://www.360.cn/ 装好系统后用它来卸载预装软件,杀毒,关闭开机启动项和清理垃圾 2.QQ http://im.qq.com/download/ 手机和电脑通信 ...

  7. hdu 5147 Sequence II (树状数组 求逆序数)

    题目链接 Sequence II Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  8. PTA 1045【DP】

    思路: DP[ i ] 代表以值 i 结尾的当前最长长度. 每次枚举序列数组,dp[ i ] = max( dp[ i ] ,dp[ a[j] ] + 1); #include <bits/st ...

  9. Ubuntu常用命令集合

    文件操作 查看当前目录: pwd 参考文章:https://blog.csdn.net/qq_33421080/article/details/76551554 应用编辑类 安装: sudo apt- ...

  10. 2014-11-3 NOIP模拟赛3

    字符串 string.pas/c/cpp 1S/256MB [题目描述] 现在给一个字符串,你要做的就是当这个字符串中存在两个挨着的字符是相同的时就将这两个字符消除.需要注意的是,当把这两个字符消除后 ...