Given a binary tree, return the preorder traversal of its nodes' values.
For example:
Given binary tree [1,null,2,3]
,
1 2 / 3
return [1,2,3]
.
Note: Recursive solution is trivial, could you do it iteratively?
递归 :
1 class Solution { 2 private List<Integer> res = new ArrayList<Integer>(); 3 public List<Integer> preorderTraversal(TreeNode root) { 4 help(root); 5 return res; 6 } 7 private void help(TreeNode root){ 8 if(root == null) return ; 9 res.add(root.val); 10 help(root.left); 11 help(root.right); 12 } 13 }
非递归:
终极版:
1 class Solution { 2 public List<Integer> preorderTraversal(TreeNode root) { 3 Stack<TreeNode> s = new Stack<TreeNode>(); 4 List<Integer> res = new ArrayList<Integer>(); 5 while(root!=null||!s.isEmpty()){ 6 while(root!=null){ 7 s.push(root); 8 res.add(root.val); 9 root = root.left; 10 } 11 if(!s.isEmpty()){ 12 root = s.pop(); 13 root = root.right; 14 } 15 } 16 return res; 17 } 18 }
1 class Solution { 2 public List<Integer> preorderTraversal(TreeNode root) { 3 List<Integer> res = new ArrayList<Integer>(); 4 5 //用stack 来保存 右子树 6 Stack<TreeNode> stack = new Stack<TreeNode>(); 7 TreeNode cur = root; 8 while(cur!=null || !stack.isEmpty()){ 9 while(cur!=null){ 10 res.add(cur.val); 11 stack.add(cur.right); 12 cur = cur.left; 13 } 14 cur = stack.pop(); 15 } 16 return res; 17 } 18 }
20180320
用stack 保存右节点跟左节点
1 class Solution { 2 public List<Integer> preorderTraversal(TreeNode root) { 3 List<Integer> res = new ArrayList<Integer>(); 4 Stack<TreeNode> stack = new Stack(); 5 stack.push(root); 6 while(!stack.isEmpty()){ 7 root = stack.pop(); 8 if (root!=null){ 9 res.add(root.val); 10 stack.push(root.right); 11 stack.push(root.left); 12 } 13 } 14 return res; 15 } 16 }