题目要求写出Binary Tree从右侧看的情况,我们首先可以想到的是基于Level Order Traversal的方法,我们只需要将每一层最右侧的节点加入结果中即可,这种思路的代码如下:
public class Solution{
public List<Integer> rightSideView(TreeNode root){
// Reverse level traversal
List<Integer> result = new ArrayList<>();
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while(queue.size() != 0){
int size = queue.size();
for(int i = 0; i < size; i++){
TreeNode current = queue.poll();
if(i == 0) result.add(current.val);
if(current.right != null) queue.offer(current.right);
if(current.left != null) queue.offer(current.left);
}
}
return result;
}
}
第二种方法是使用递归,由于这是一道Binary Tree的题目,所以我们自然想到要使用递归的方法,但是这道题目递归的条件很难发现。这里使用的是result的size与当前节点所在的层数相等的时候这个条件,每当这个条件达成的时候,就将当前节点的值加入结果中。因为我们首先是向右递归,所以如果上面的条件达成,且当前的右结点不为空的时候,我们将右边的这个结点加入结果集当中,而如果右子树为空,算法会继续递归地寻找左子树,直到上面的条件达成,故而这个条件的选择非常巧妙。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
// Method One
public class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new LinkedList<Integer>();
rightView(root, result, 0);
return result;
}
private void rightView(TreeNode root, List<Integer> result, int depth){
if(root == null) return;
if(depth == result.size()) result.add(root.val);
rightView(root.right, result, depth + 1);
rightView(root.left, result, depth + 1);
}
}
总的来说这两种方法都非常好,第一种方法基础,第二种方法巧妙,但是不容易想到,所以还是要把握基础,在面试的时候要保证能想到第一种算法。
知识点:
1. Binary Tree Level Order Traversal这个算法要牢记