94. Binary Tree Inorder Traversal

不定期更新leetcode解题java答案。

采用pick one的方式选择题目。

题意为采用中序遍历的方式遍历一个给定二叉树。中序遍历的方式为从左至右,从下至上的进行遍历。

例如:

Given binary tree [1,null,2,3],

   1
    \
     2
    /
   3

return [1,3,2].

采用递归的方式可以轻松地进行遍历:构造一个递归函数,依次对左子树进行递归、添加当前根节点、对右子树进行递归,代码如下:

 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> inorderTraversal(TreeNode root) {
12         List<Integer> list = new ArrayList();
13         
14         addList(list, root);
15         
16         return list;
17     }
18     public void addList(List<Integer> list, TreeNode root){
19         if(root != null){
20             addList(list, root.left);
21             list.add(root.val);
22             addList(list, root.right);
23         }
24     }
25 }

本题希望不采用递归方式进行遍历(Recursive solution is trivial, could you do it iteratively?)。因此采用栈来存储节点,在每次存储时,首先将左子树全添加进栈中;直至左子树为空,取出最后添加的节点加入List中;再进行右子树的判断,如果存在右子树,则应将之添加进栈中,重新进行循环添加右子树的左子树;若右子树为空,则应再取出栈中上一节点加入List中(这里需要注意的是,由于采用了先存储所有的左子树,需增加一个额外变量来确定左侧子树是否已经添加进List中)。具体代码如下:

 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> inorderTraversal(TreeNode root) {
12         List<Integer> list = new ArrayList();
13         if(root == null)
14             return list;
15             
16         Stack<TreeNode> stack = new Stack();
17         stack.push(root);
18         boolean examineLeft = true;
19         
20         while(!stack.empty()){
21             while(root.left != null && examineLeft){
22                 stack.push(root.left);
23                 root = root.left;
24             }
25             
26             root = stack.pop();
27             list.add(root.val);
28             
29             if(root.right == null){
30                 examineLeft = false;
31             }else{
32                 stack.push(root.right);
33                 root = root.right;
34                 examineLeft = true;
35             }
36         }
37         
38         return list;
39     }
40 }

 

posted @ 2016-10-10 14:33  zslhq~  阅读(119)  评论(0编辑  收藏  举报