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?
本题和Binary Tree Inorder Traversal有点类似,但是思路是有点不相同的,先说本题思路,也是创建一个stack,一个Treenode,但是stack用来存储所有的右节点,先把node的值存储到list里面,然后遍历到它的左节点,如果它的左节点为null并且stack有值,则让节点等于stack的pop值,代码如下:
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public List<Integer> preorderTraversal(TreeNode root) { 12 List<Integer> res= new ArrayList<Integer>(); 13 Stack<TreeNode> stack = new Stack<TreeNode>(); 14 TreeNode node = root; 15 while(node!=null){ 16 res.add(node.val); 17 if(node.right!=null){ 18 stack.push(node.right); 19 } 20 node = node.left; 21 if(node==null&&!stack.isEmpty()){ 22 node = stack.pop(); 23 } 24 } 25 return res; 26 } 27 }
问题来了,那么它和中序遍历中有什么不同呢?首先,中序的循环里面还有一个while循环,这个while用来遍历到最左面的节点用的,而先序遍历是不用这么做的。其次,res的add情况不同,中序是遍历到最左面之后在add,而中序是每次循环开始的时候add的;第三,stack存储的值不同,中序里面存储的是中间节点(相对来说),而先序遍历里面存储的是右节点;