題目要求寫出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這個算法要牢記