144. Binary Tree Preorder Traversal

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存储的值不同,中序里面存储的是中间节点(相对来说),而先序遍历里面存储的是右节点;

posted @ 2017-03-23 06:40  CodesKiller  阅读(152)  评论(0编辑  收藏  举报