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?
[解题思路]
递归解法
1 public ArrayListpreorderTraversal(TreeNode root) { 2 // IMPORTANT: Please reset any member data you declared, as 3 // the same Solution instance will be reused for each test case. 4 ArrayList result = new ArrayList (); 5 6 preorder(root, result); 7 8 return result; 9 }10 11 public void preorder(TreeNode root, ArrayList result){12 if(root != null){13 result.add(root.val);14 preorder(root.left, result);15 preorder(root.right, result);16 }17 }
[非递归解法]
1)访问节点cur,并将节点cur入栈;
2)判断节点cur的左孩子是否为空,若为空,则取栈顶节点并进行出栈操作,并将栈顶节点的右孩子置为当前节点cur,循环至1);若不为空,则将cur的左孩子置为当前节点cur;
3)知道cur为null并且栈为空,则遍历结束
1 public ArrayListpreorderTraversal(TreeNode root) { 2 // IMPORTANT: Please reset any member data you declared, as 3 // the same Solution instance will be reused for each test case. 4 ArrayList result = new ArrayList (); 5 if(root == null){ 6 return result; 7 } 8 9 Stack stack = new Stack ();10 TreeNode cur = root;11 while(cur != null || !stack.empty()){12 13 while(cur != null){14 result.add(cur.val);15 stack.push(cur);16 cur = cur.left;17 }18 19 if(!stack.empty()){20 cur = stack.pop();21 // if(cur.right != null){ 22 cur = cur.right;23 // }24 }25 }26 27 return result;28 }