LeetCode 199 側面觀察二叉樹(java)

一、題目

題目分析:

側面觀察二叉樹,將觀察到的節點從上到下依次輸出-->也就是層次遍歷二叉樹,輸出每一層的最後一個節點 

二、

java代碼

 

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List <Integer> nodes =new ArrayList<Integer>();
        if(root==null){
            return nodes;
        }
        bfs(root, nodes)//廣度搜索
        return nodes;
    }
    public void bfs(TreeNode root, List<Integer> nodes){
        Queue<TreeNode> currentLevel= new LinkedList<TreeNode>();
        currentLevel.add(root);
        while(!currentLevel.isEmpty()){//當前層不爲空
            int size=currentLevel.size();//當前層結點個數+上一層遺留的最後一個節點
            for(int i=0;i<size-1;i++){//遍歷size-1次,留下上一層最後一個節點
                TreeNode currentNode=currentLevel.poll();
                if(currentNode.left!=null)//後續節點繼續加入
                    currentLevel.add(currentNode.left);
                if(currentNode.right!=null)
                    currentLevel.add(currentNode.right);
            }
            TreeNode lastnode=currentLevel.poll();//這個就是上一層的最後一個節點
            nodes.add(lastnode.val);
            if(lastnode.left!=null)
                currentLevel.add(lastnode.left);
            if(lastnode.right!=null)
                currentLevel.add(lastnode.right);
        }
    }
}

分析:

其實最容易想到的是,保存每一層的節點,然後輸出最後一個節點就可以了

關於什麼時候用arraylist 什麼時候用linkedlist,前者是基於數組的數據結構,後者是基於鏈表的數據結構。前者查詢較快,後者增刪改較快。

Queue<TreeNode> currentLevel= new LinkedList<TreeNode>();

隊列是先進先出,所以poll的是頭的位置

要麼記錄每層有幾個節點,定義一個num值,然後彈一個節點,記錄後續左右孩子,直到num值定位到最右節點加入到nodes裏面

本題採用的是,每一次都將每層的最右節點留下來,然後下一層的節點依次加入到queue裏面,然後彈出queue的頭,也就是上一層的最右節點,這種做法比較機智哦,但感覺還是記錄num個數更好想

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