您的位置:首页 > 其它

144. Binary Tree Preorder Traversal

2017-03-23 06:40 204 查看

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: