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 }