Binary Tree Right Side View

思考:只需要知道每一行的最後一個節點值即可。

方法

  • 1、考慮使用兩個隊列進行BFS,A隊列存放當前行的節點,B隊列存放當前節點的子節點,即當A隊列空時,最後一個訪問的節點即位當前行的最後一個節點。
  • 2、遞歸遍歷。每一層都會有一個值加入列表,即可以利用DFS來遍歷,並傳入當前深度level(root爲1),如果當前深度等於re(結果列表)的長度,即將re的第level個值更新爲當前節點的值(每一行的最後一個節點會覆蓋其之前的所有節點,這樣re中存的就是最右邊的值)。如果level大於re的長度,則添加當前節點值爲re的第level個值(level只會比re長度大一,所以直接add就可以)。

代碼塊

利用雙隊列

    public class Solution {
        public List<Integer> rightSideView(TreeNode root) {
            Queue<TreeNode> q1 = new LinkedList<TreeNode>();
            List<Integer> re = new LinkedList<Integer>();
            if(root == null)
                return re; 
            q1.add(root);
            while(!q1.isEmpty()){
                Queue<TreeNode> q2 = new LinkedList<TreeNode>();
                TreeNode temp = null;
                while(!q1.isEmpty()){
                    temp = q1.poll();
                    if(temp.left != null)
                        q2.add(temp.left);
                    if(temp.right != null)
                        q2.add(temp.right);
                }
                re.add(temp.val);
                q1.addAll(q2);
            }
            return re;
        }
    }

利用遞歸

    public class Solution {
        public List<Integer> rightSideView(TreeNode root) {

            List<Integer> re = new LinkedList<Integer>();
            DFSRightView(root, 1, re);
            return re;
        }

        void DFSRightView(TreeNode node, int level, List<Integer>re){
            if(node == null)
                return;
            if(level > re.size())   re.add(node.val);
            else    re.set(level - 1, node.val);

            DFSRightView(node.left, level + 1, re);
            DFSRightView(node.right, level + 1, re);
        }
    }
發佈了29 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章