LeetCode#199. Binary Tree Right Side View

  • 題目:站在一棵二叉樹的右邊,返回能看到的節點的值(一個list)
  • 難度:Medium
  • 思路:根據題目意思可以理解爲返回二叉樹每一層的最右邊的節點的值,所以可以用一個隊列來存儲每一層的節點,遍歷隊列裏的節點,取當前隊列裏的最後一個節點值(用一個size來記錄上一層節點總數)
  • 代碼:
public class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if(root == null){
            return result;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while(queue.size() > 0){
            int size = queue.size();
            for(int i = 0; i < size-1; i++){
                TreeNode node = queue.poll();
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            TreeNode nodeAdd = queue.poll();
            result.add(nodeAdd.val);
            if(nodeAdd.left != null){
                queue.offer(nodeAdd.left);
            }
            if(nodeAdd.right != null){
                queue.offer(nodeAdd.right);
            }
        }
        return result;      
    }
}

方法二:遞歸進行層次遍歷,每次遍歷的時候先訪問右子樹,同時通過一個trick(拿結果列表的大小和當前訪問的數的層數進行比較)
這種遞歸的方式居然效率比用隊列快(76% VS 27%)

public class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> result = new ArrayList<Integer>();
        rightView(root, result, 0);
        return result;
    }

    public void rightView(TreeNode curr, List<Integer> result, int currDepth){
        if(curr == null){
            return;
        }
        if(currDepth == result.size()){
            result.add(curr.val);
        }

        rightView(curr.right, result, currDepth + 1);
        rightView(curr.left, result, currDepth + 1);

    }
}
發佈了184 篇原創文章 · 獲贊 7 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章