Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree {1,#,2,3}
,
1 \ 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
我用了递归和迭代两种方法来做:package leetcode;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;
public class Binary_Tree_Preorder_Traversal_144 {
public List<Integer> preorderTraversal1(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
DFS(list,root);
return list;
}
public void DFS(List<Integer> list,TreeNode node){
if(node==null){
return;
}
list.add(node.val);
DFS(list,node.left);
DFS(list,node.right);
}
public List<Integer> preorderTraversal2(TreeNode root) {
List<Integer> list=new ArrayList<Integer>();
if(root==null){
return list;
}
Stack<TreeNode> stack=new Stack<TreeNode>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode 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 void main(String[] args) {
// TODO Auto-generated method stub
Binary_Tree_Preorder_Traversal_144 b=new Binary_Tree_Preorder_Traversal_144();
TreeNode root=new TreeNode(1);
root.right=new TreeNode(2);
root.right.left=new TreeNode(3);
List<Integer> list=b.preorderTraversal2(root);
for(Integer i:list){
System.out.print(i+" ");
}
}
}
大神也用了迭代,不过思路有所不同:栈中只存储 right children .
public List<Integer> preorderTraversal(TreeNode node) {
List<Integer> list = new LinkedList<Integer>();
Stack<TreeNode> rights = new Stack<TreeNode>();
while(node != null) {
list.add(node.val);
if (node.right != null) {
rights.push(node.right);
}
node = node.left;
if (node == null && !rights.isEmpty()) {
node = rights.pop();
}
}
return list;
}