非递归遍历二叉树Java版的实现代码(没写层次遍历)
直接上代码呵呵,里面有注解
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版的实现代码(没写层次遍历)的更多相关文章
- java版第一个代码——HelloWorld!
java版第一个代码--HelloWorld! 今天来接触一下java代码: 事前准备 jdk的配置(推荐jdk8或jdk11) notepad++或idea软件 开始编写 建立文件夹存放代码 建立j ...
- 非递归遍历二叉树Java实现
2018-10-03 20:16:53 非递归遍历二叉树是使用堆栈来进行保存,个人推荐使用双while结构,完全按照遍历顺序来进行堆栈的操作,当然在前序和后序的遍历过程中还有其他的压栈流程. 一.Bi ...
- 手写二叉树-先序构造(泛型)-层序遍历(Java版)
如题 先序构造 数据类型使用了泛型,在后续的更改中,更换数据类型只需要少许的变更代码 层序遍历 利用Node类的level属性 所有属性的权限全为public ,为了方便先这么写吧,建议还是用priv ...
- 非递归实现二叉树的三种遍历操作,C++描述
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...
- Python非递归实现二叉树的后续遍历
leetcode 145. Binary Tree Postorder Traversal 思路一: 使用一个栈stack保存经过的根结点,另一个栈flag保存每个结点的右子树是否遍历: 如果根结点存 ...
- 非递归创建二叉树( C++队列 )
非递归按照 层序 创建二叉树,利用 队列(即可先进先出特点)存放已访问的结点元素的地址. 初始化:front=rear= -1: 每储存一个结点元素 rear+1 ,利用 rear%2==0 来使 f ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- Java 非递归实现 二叉树的前中后遍历以及层级遍历
class MyBinaryTree<T> { BinaryNode<T> root; public MyBinaryTree() { root = new BinaryNod ...
随机推荐
- Cloudera运维
1. 增加一个节点 1. 拷贝cm的jar包到该节点 2. 设置hostname(hostnamectl set-hostname XXX),然后修改hosts文件 3. 所有的节点添加该hostna ...
- POJ2449:K短路
Remmarguts' Date Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 26355 Accepted: 7170 ...
- HDU1548(楼梯问题bfs)
#include"cstdio" #include"queue" #include"cstring" using namespace std ...
- HTML5对表单的约束验证
在HTML5中增加了许多新的功能,用于表单提交到服务器之前对表单进行数据的验证(抢了javascript的饭碗),有了这些功能,即便是javascript没有加载进来还是可以确保基本的验证.换句话说, ...
- DDoS攻防战(二):CC攻击工具实现与防御理论--删除
我们将要实现一个进行应用层DDoS攻击的工具,综合考虑,CC攻击方式是最佳选择,并用bash shell脚本来快速实现并验证这一工具,并在最后,讨论如何防御来自应用层的DDoS攻击. 第一步:获取大量 ...
- java基础知识(4)---设计模式
设计模式:解决问题最行之有效的思想.是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. java中有23种设计模 ...
- python中报中文编码异常,Non-ASCII ,but no encoding declared
异常信息: SyntaxError: Non-ASCII character '\xe5' in file a.py on line 9, but no encoding declared; see ...
- 创建Ajax
Ajax的全称是Asynchronous javascript and XML = 异步传输 + JS + XML 不需要刷新页面就可以获取新的数据 创建步骤: (1)创建XML对象也就 ...
- ssh动态转发小记
ssh,一般常用来做远程登录管理,也就是连上远程机器,得到一个shell,然后交互式地在上面敲命令-看结果-再敲命令. 偶尔也会用在脚本里,做些自动化批处理上传下载的操作,但本质上也是用shell来执 ...
- 19E Fairy
Once upon a time there lived a good fairy A. One day a fine young man B came to her and asked to pre ...