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

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. 洛谷【P1104】生日(冒泡排序版)

    题目传送门:https://www.luogu.org/problemnew/show/P1104 题目很简单,我主要是来讲冒泡排序的. 所谓冒泡排序,流程如下: 每次确定一个\(rk\)(从\(n\ ...

  2. JavaScript编写代码时候没有提示

    如上图所示如果没有提示可能是箭头所指示的类型不正确.

  3. Linux ssh 不需要输入密码的方法

    采用证书的方法可以解决ssh不需要输入密码的问题. 本文采用CentOS的操作系统,创建SSH的key,并在两台或多台机器间实现信任.从而实现SSH登录不需要输入密码的功能. 首先,在一台机器上创建S ...

  4. Wireshark抓包常见问题解析

    1.   tcp out-of-order(tcp有问题) 解答: 1).    应该有很多原因.但是多半是网络拥塞,导致顺序包抵达时间不同,延时太长,或者包丢失,需要重新组合数据单元 因为他们可能是 ...

  5. 关于系统中:/dev/mem

    1)参考:https://blog.csdn.net/lsn946803746/article/details/52948036   博主:lsn946803746 2)参考:https://blog ...

  6. 人物-IT-马化腾:马化腾

    ylbtech-人物-IT-马化腾:马化腾 马化腾,1971年10月29日生于原广东省海南岛东方市八所港(今海南省东方市),祖籍广东省汕头市.腾讯公司主要创办人之一.现任腾讯公司董事会主席兼首席执行官 ...

  7. rufus-scheduler定时任务示例代码

    require 'rubygems' require 'rufus/scheduler' scheduler = Rufus::Scheduler.start_new scheduler.in '20 ...

  8. Centos6.5_64位系统下安装Oracle 11g

    一.硬件要求 1.内存与Sweap:内存2G(以上),Sweap 2G(以上) 内存: 1-2G 2-16G 16G以上 Sweap: 1.5倍内存 1倍内存 16G 检查:# grep MemTot ...

  9. 【总结整理】关于Json的解析,校验和验证

    var jasondata='{"staff": [{"name":"红旗","age":90}, {"nam ...

  10. 5.6 安装slack,Skype,google

    1.将安装包放到自己的目录下: 2.打开终端,进入安装包所在的目录(cd /文件名) 3.输入命令:sudo apt-get install 安装包名 4.等待安装结束 5. 在搜索框中输入关键字sl ...