思路:同InorderTraversal,利用两层while循环,外层代表总的递归,里层while代表不断寻找左子节点的过程,因为是前序遍历,将add操作放在内层while就好了。
import java.util.LinkedList;
import java.util.List;
import java.util.Stack;
/**
* Created by marsares on 15/6/14.
*/
public class BinaryTreePreorderTraversal {
public List<Integer> preorderTraversal(TreeNode root) {
if(root==null)return new LinkedList<Integer>();
List<Integer>list=new LinkedList<Integer>();
Stack<TreeNode>stack=new Stack<TreeNode>();
stack.add(root);
TreeNode current=root;
while(!stack.empty()){
while(current!=null){
list.add(current.val);
stack.push(current);
current=current.left;
}
if(stack.peek().right!=null){
current=stack.peek().right;
stack.pop();
}else{
stack.pop();
}
}
return list;
}
public void printList(List<Integer>list){
System.out.print("[");
for(int i=0;i<list.size()-1;i++){
System.out.print(list.get(i)+",");
}
System.out.println(list.get(list.size()-1)+"]");
}
public static void main(String[]args){
BinaryTreePreorderTraversal btpt=new BinaryTreePreorderTraversal();
BinaryTreeSerialize bts=new BinaryTreeSerialize();
TreeNode root=bts.Unserialize("{3,9,20,#,#,15,7}");
btpt.printList(btpt.preorderTraversal(root));
}
}