LeetCode - 199. Binary Tree Right Side View

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章