二叉樹遍歷非遞迴演算法
阿新 • • 發佈:2018-12-13
二叉樹遍歷的非遞迴演算法(java實現)
package com.mpackage.tree;
import java.util.*;
public class TreeSolution {
//先根遍歷
public static ArrayList<Integer> prePrint(TreeNode t){
ArrayList<Integer> result=new ArrayList<Integer>();
if(t==null){
return result;
}
Stack<TreeNode> stack= new Stack<TreeNode>();
while(!stack.isEmpty()||t!=null){
while(t!=null){
result.add(t.val);
stack.push(t);
t=t.left;
}
if(!stack.isEmpty()){
TreeNode tnode=stack.pop();
t=tnode.right;
}
}
return result;
}
//先序遍歷2
public static ArrayList<Integer> prePrint2 (TreeNode t){
ArrayList<Integer> list=new ArrayList<Integer>();
if(t==null){
return list;
}
Stack<TreeNode> stack=new Stack<TreeNode>();
stack.push(t);
TreeNode node;
while(!stack.isEmpty()){
node=stack.pop();
list.add(node.val);
if(node.right!=null) {
stack.push(node.right);
}
if(node.left!=null){
stack.push(node.left);
}
}
return list;
}
//中序遍歷
public static ArrayList<Integer> midPrint(TreeNode t){
ArrayList<Integer> result=new ArrayList<Integer>();
if(t==null){
return result;
}
Stack<TreeNode> stack=new Stack<TreeNode>();
while(!stack.isEmpty()||t!=null){
while(t!=null){
stack.push(t);
t=t.left;
}
if(!stack.isEmpty()){
TreeNode tnode=stack.pop();
result.add(tnode.val);
t=tnode.right;
}
}
return result;
}
//後序遍歷
public static ArrayList<Integer> postPrint(TreeNode t){
ArrayList<Integer> list=new ArrayList<Integer>();
if(t==null){
return list;
}
TreeNode node=null;
TreeNode pre=null;//上一個訪問的節點
Stack<TreeNode> stack=new Stack<TreeNode>();
while(t!=null||!stack.isEmpty()){
while(t!=null){
stack.push(t);
t=t.left;
}
if(!stack.isEmpty()){
node=stack.peek();
//如果該節點的右孩子為空或者等於上一個訪問的節點,則可以訪問該節點
if(node.right!=null&&node.right!=pre){
t=node.right;
}
else{
stack.pop();
list.add(node.val);
pre=node;
}
}
}
return list;
}
//後序遍歷2
//思路:後序遍歷順序為左->右->根,
//可以按根->右->左遍歷,然後轉置;
public static ArrayList<Integer> postPrint2(TreeNode t){
ArrayList<Integer> list=new ArrayList<Integer>();
if(t==null){
return list;
}
Stack<TreeNode> stack=new Stack<TreeNode>();
stack.push(t);
TreeNode node=null;
while(!stack.isEmpty()){
node=stack.pop();
list.add(node.val);
if(node.left!=null){
stack.push(node.left);
}
if(node.right!=null){
stack.push(node.right);
}
}
Collections.reverse(list);
return list;
}
}