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

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. dcos的问题汇总

    . group 'docker' does not exist 需要手工创建docker组,这一步本来应该是在安装docker的时候来完成的,但是采用yum install的方式不行,需要添加一个do ...

  2. UILabel常见用法

    //创建一个UILabel UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(50 , 100 , 200 , 560)]; // ...

  3. css画三角形

    效果图: 代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset=" ...

  4. 前端框架:template

    ylbtech-前端框架: 1.返回顶部   2.返回顶部   3.返回顶部   4.返回顶部   5.返回顶部     6.返回顶部   作者:ylbtech出处:http://ylbtech.cn ...

  5. 不卸载ceph重新获取一个干净的集群环境

    不卸载ceph重新获取一个干净的集群环境 标签(空格分隔): ceph ceph环境搭建 运维 部署了一个ceph集群环境,由于种种原因需要回到最开始完全clean的状态,而又不想卸载ceph客户端或 ...

  6. Mybatis连接mysql数据库出现乱码

    对于mysql数据库的乱码问题,有两中情况: 1. mysql数据库编码问题(建库时设定). 2. 连接mysql数据库的url编码设置问题. 对于第一个问题,目前个人发现只能通过重新建库解决,建库的 ...

  7. python 基础 操作文件和目录

    获得当前目录路径 :os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 删除一个文件:os.remove(filename) 删除多个空目录 :os.removefir ...

  8. CSS3新增的伪类

    Element1 ~ element2:选择前面有element1的所有element2元素 [attr ^= val] 属性值以val开头的元素 [attr $= val] 属性值以val结尾的元素 ...

  9. [解决问题]ubuntu无法virtualenv创建python虚拟环境的解决

    刚有人问我Ubuntu python虚拟环境无法创建问题,报错same file error,防止今后遇到忘记,记录下可能的问题. 1.先在windows上试了下: pip install virtu ...

  10. Unity实现支持泛型的事件管理以减少使用object作为参数带来的频繁装拆箱

    如果不用C#自身的event关键字而是要自己实现一个可统一管理游戏中各种消息事件通知管理的系统模块EventManger时,通常都是把事件delegate的参数定义为object类型以适应所有的数据类 ...