由二叉樹的右視圖(Leetcode.199)帶來的進一步學習

題目:

給定一棵二叉樹,想象自己站在它的右側,按照從頂部到底部的順序,返回從右側所能看到的節(jié)點值。

實例:


思路:

使用BFS進行層次遍歷,將每一層的最后遍歷到的節(jié)點(即當層最右的節(jié)點)存入鏈表輸出。


代碼實現(xiàn):

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> list = new LinkedList<Integer>();
        if(root == null) {
            return list;
        }
        Queue<TreeNode> que = new LinkedList<TreeNode>();
        que.add(root);
        while(!que.isEmpty()){
            int levelSize = que.size();
            for(int i = 0; i < levelSize; i++){
                TreeNode node = que.poll();
                if(node.left != null) {
                    que.add(node.left);
                }
                if(node.right != null) {
                    que.add(node.right);
                }
                if(i == levelSize-1){
                    list.add(node.val);
                }
            }
        }
        return list;
    }
}

思考:

a.Queue<TreeNode> que = new LinkedList<TreeNode>(); 這一句代碼,我之前寫的時候,有時候我會寫成這樣:b.List<TreeNode> que = new LinkedList<TreeNode>();,或是這樣:c.LinkedList<TreeNode> que = new LinkedList<TreeNode>();。這種細節(jié)的地方我沒有關注到,其實這是因為對API不熟悉對多態(tài)的理解不充分導致的。

1. 為什么要寫成ab,而不是c?
面向對象三特性,“繼承,多態(tài),封裝”,多態(tài)是同一個行為具有多個不同表現(xiàn)形式或形態(tài)的能力。多態(tài)就是同一個接口,使用不同的實例而執(zhí)行不同操作。
List是一個接口,而這個接口下面有多個實現(xiàn)類,包括Arraylist,StackVector,LinkedList等。List對象可以調用父類和子類共有的方法,執(zhí)行的是子類的方法,不可調用子類特有的方法,如果要調用子類特有的方法就需要下轉型。
此時對象為父類的對象,子類的實例化,等號左邊為編譯時類型,右邊為運行時類型。(在程序未運知行時道que只能當做List類型,在程序運行時JVM會把容que當做ArrayList類型。)
這種操作滿足了依賴倒置原則。程序要盡量依賴于抽象,不依賴于具體。在需要修改子類類型的時候,如直接修改LinkedListArraylist即可,因為一個接口多種實現(xiàn),在換一種實現(xiàn)的時候修改的地方很少。這種操作也滿足了里氏代換原則。

向下轉型:

    Son p1 = (Son)p;
    System.out.println(a instanceof Son);//true
    System.out.println(a instanceof Father);//true

里氏代換原則:
任何基類出現(xiàn)的地方子類一定可以出現(xiàn)。該原則可以降低程序的耦合性。

2. 什么時候要寫成a,什么時候要寫成b?
因為LinkedList同時繼承了DequeCollection接口,例如LinkedList中的offer()add()就是分別實現(xiàn)的這兩個接口中定義的方法,功能是很相似的(除了為空時,若調用該方法,offer()會返回false,add()會報錯)。習慣是根據(jù)情境選擇想要創(chuàng)建對象的接口。并使用對應實現(xiàn)的方法。


回顧:

二叉樹的最大深度(Leetcode.104)一題的BFS解法的思路非常相似。

private static int maxDepth1(TreeNode root) {
        if (root == null) {
            return 0;
        }
        LinkedList<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int maxDepth = 0;
        while (!queue.isEmpty()) {
            maxDepth++;
            int levelSize = queue.size();
            for (int i = 0; i < levelSize; i++) {
                TreeNode node = queue.pollFirst();
                if (node.left != null) {
                    queue.add(node.left);
                }
                if (node.right != null) {
                    queue.add(node.right);
                }
            }
        }
        return maxDepth;
    }
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,419評論 0 2
  • 面向對象主要針對面向過程。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,217評論 0 4
  • java基礎 集合承繼包含圖 Collection vs Collections 首先,"Collection" ...
    onlyHalfSoul閱讀 1,427評論 0 5
  • Java基礎面試 Java基礎面試... 1 1. Java基礎知識... 5 1.1. Java源程序的擴展名是...
    來著何人閱讀 1,284評論 0 1
  • 8月14日打卡 今天出差晚上又加班,所以讀的書很少。 晚上先拿出冀劍制的《是思考還是想太多》這本書讀了前面幾篇。印...
    鐵路人的生活閱讀 238評論 0 0

友情鏈接更多精彩內容