二叉树系列之二叉树的遍历
2016-11-23 19:22
176 查看
二叉树的遍历:递归法和非递归法
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
class TreeNode {
TreeNode left = null;
TreeNode right = null;
int val = 0;
public TreeNode(int val) {
this.val = val;
}
}
//遍历二叉树
public class Ergodic {
//1.先序遍历-递归
public static void preOrderPrint(TreeNode node){
if(node != null){
System.out.print(node.val+" ");
preOrderPrint(node.left);
preOrderPrint(node.right);
}
}
//2.中序遍历-递归
public static void midOrderPrint(TreeNode node){
if(node != null){
midOrderPrint(node.left);
System.out.println(node.val);
midOrderPrint(node.right);
}
}
//3.后序遍历-递归
public static void afterOrderPrint(TreeNode node){
if(node != null){
afterOrderPrint(node.left);
afterOrderPrint(node.right);
System.out.println(node.val);
}
}
//4.先序遍历-非递归版
public static void preNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
System.out.println(currNode.val);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
currNode = currNode.right;
}
}
}
//5.中序遍历-非递归版
public static void midNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
System.out.println(currNode.val);
currNode = currNode.right;
}
}
}
//6.后序遍历-非递归版
public static void afterNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
Set<TreeNode> set =new HashSet<TreeNode>();
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
set.add(currNode);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
if(set.contains(currNode)){
boolean b = set.remove(currNode);
stack.push(currNode);
currNode = currNode.right;
}else{
System.out.println(currNode.val);
currNode = null;
}
}
}
}
}
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.Stack;
class TreeNode {
TreeNode left = null;
TreeNode right = null;
int val = 0;
public TreeNode(int val) {
this.val = val;
}
}
//遍历二叉树
public class Ergodic {
//1.先序遍历-递归
public static void preOrderPrint(TreeNode node){
if(node != null){
System.out.print(node.val+" ");
preOrderPrint(node.left);
preOrderPrint(node.right);
}
}
//2.中序遍历-递归
public static void midOrderPrint(TreeNode node){
if(node != null){
midOrderPrint(node.left);
System.out.println(node.val);
midOrderPrint(node.right);
}
}
//3.后序遍历-递归
public static void afterOrderPrint(TreeNode node){
if(node != null){
afterOrderPrint(node.left);
afterOrderPrint(node.right);
System.out.println(node.val);
}
}
//4.先序遍历-非递归版
public static void preNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
System.out.println(currNode.val);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
currNode = currNode.right;
}
}
}
//5.中序遍历-非递归版
public static void midNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
System.out.println(currNode.val);
currNode = currNode.right;
}
}
}
//6.后序遍历-非递归版
public static void afterNoRecursionOrderPrint(TreeNode node){
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode currNode = node;
Set<TreeNode> set =new HashSet<TreeNode>();
while(currNode != null || !stack.isEmpty()){
while(currNode != null){
stack.push(currNode);
set.add(currNode);
currNode = currNode.left;
}
if(!stack.isEmpty()){
currNode = stack.pop();
if(set.contains(currNode)){
boolean b = set.remove(currNode);
stack.push(currNode);
currNode = currNode.right;
}else{
System.out.println(currNode.val);
currNode = null;
}
}
}
}
}
相关文章推荐
- 二叉树系列文章之二 二叉树的递归遍历
- 二叉树系列1: 层次遍历二叉树
- python剑指offer系列层序遍历二叉树
- 二叉树系列四:二叉树的遍历(非递归)
- 二叉树系列三:二叉树的遍历(递归方法)
- [算法系列之二]二叉树各种遍历
- 二叉树系列(一):已知先序遍历序列和中序遍历序列,求后序遍历序列
- lintcode 二叉树的层次遍历系列问题 -解决方法和领会
- 使用迭代法对二叉树进行后序遍历——Leetcode系列(六)
- 数据结构(二叉树系列)先序创建三种遍历和求深度(递归实现)
- 二叉树系列——层序遍历二叉树
- 二叉树系列:已知二叉树的中序遍历和前序遍历,求后序遍历
- 二叉树系列——二叉树的定义以及各种遍历方式
- [算法系列之二]二叉树各种遍历
- 二叉树系列6:非递归遍历
- 微软面试100题系列---二叉树的层次遍历
- 算法系列(七)数据结构之树的基本结构和二叉树的遍历
- 二叉树系列(1)已知二叉树的中序遍历和前序遍历,如何求后序遍历
- 【应聘笔记系列】二叉树的递归与非递归遍历实现
- 【面试算法系列】已知二叉树的前序和中序遍历重建二叉树 - C语言实现