非递归遍历二叉树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 ...
随机推荐
- Poj 2136 Vertical Histogram(打印垂直直方图)
一.Description Write a program to read four lines of upper case (i.e., all CAPITAL LETTERS) text inpu ...
- 怎么查看mysql的安装目录,环境:windows+mysql+navicat
怎么查看mysql的安装目录 如果忘记了MySQL的安装目录,怎么快速找到呢?方法或许很多,作者觉得这种最方便了 环境:windows+mysql+navicat 方法:进入mysql命令行输入:sh ...
- 共有11款Python 中文分词库开源软件
件过滤: 排序: 收录时间 | 浏览数 Python 中文分词库 Yaha "哑哈"中文分词,更快或更准确,由你来定义.通过简单定制,让分词模块更适用于你的需求. "Ya ...
- 代码 c++实现动态栈
//============================================================================ // Name : 栈.cpp // Au ...
- EPEL for CentOS or Redhat
注:地址可能会变 RHEL/CentOS 7 64 Bit # wget http://dl.fedoraproject.org/pub/epel/beta/7/x86_64/epel-release ...
- win7中配置eclipse连接Ubuntu内的hadoop
Hadoop java 分布式 云计算 数据库 目录[-] 1.设置Ubuntu静态IP: 1)配置网卡参数到interfaces文件: 2)重启网卡: 2.配置Ubuntu的hosts: 3.配置V ...
- 关于android上dpi/screen-size的厘清解释
android定义了四种screen-size: small normal large xlarge 同时定义了六种dpi级别: ldpi (low) ~120dpimdpi (medium) ~16 ...
- p4555&bzoj2565 最长双回文串
传送门(洛谷) 传送门(bzoj) 题目 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为abc,逆序为cba,不相同). 输入长度为 nnn 的串 SSS ...
- CodeForces 492A Vanya and Cubes
A. Vanya and Cubes time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- EasyUI知识点汇总
combobox联动设置 $(document).ready(function() { $('#gdfsdl1').combobox({ onSelect: function(record){ $(' ...