1. 程式人生 > >二叉樹遍歷非遞迴演算法

二叉樹遍歷非遞迴演算法

二叉樹遍歷的非遞迴演算法(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; } }