1. 程式人生 > 資訊 >榮耀 MagicBook 16 系列年底全面升級,可與 X30 等手機、平板、智慧屏多屏協同

榮耀 MagicBook 16 系列年底全面升級,可與 X30 等手機、平板、智慧屏多屏協同

第一次接觸二叉樹的遞迴型別的題目。一般對於這種題目,我們需要做的是:1. 寫一個遞迴方法。 2. 在主方法裡呼叫這個遞迴方法

一. 寫一個遞迴方法

  對於遞迴方法,我們可以分為兩部分 —— 1. 基本情況 2. 特殊情況基本情況實際上就是遞迴的退出條件,而特殊情況就是進行遞迴。對於這個題目,我們會寫一個check(TreeNode A,TreeNode B)的遞迴方法,它的主要作用就是判斷 B結點是否為A結點的子結構

  那麼我們先分析一下基本情況:1. 如果B結點為 null,那麼它最起碼不會干擾最終結果,因此返回 true,這種情況已經包含了 B==null&&A==null的情況。 2. 如果A結點為null而B結點不為null,那麼肯定返回 false。3. 如果A結點的 val 與 B結點的 val 不相等,那麼返回 false。

  我們再分析一下特殊情況:也就是還無法判斷B是否為A結點的子結構,說明 A.val == B.val,那麼我們接下來要做的就是,判斷B的左右子節點是不是A的左右子節點 的子結構。這時候我們就要進行遞迴呼叫:呼叫 check(A.left,B.left) 和 check(A.right,B.right)。並返回兩者的結果。

    public boolean check(TreeNode A, TreeNode B){
        //基本情況
        if(B==null){
            return true;//B的結構為空,不影響結果,返回true
        }
        
if(A==null||A.val!=B.val){ return false; //A是空或值不同,不是子樹 } //特殊情況,遞迴,檢視左子樹和右子樹是否構成子結構 return check(A.left,B.left)&&check(A.right,B.right); }

二. 在主方法裡呼叫遞迴方法

  首先我們在主方法裡要把特殊情況先寫出來,也即 A==null || B==null 時,返回false。

  然後我們就需要考慮:我們應該怎麼樣呼叫遞迴方法。首先我們可以呼叫 check(A,B),來檢視B是否為A的子結構。但是問題是,B有可能是A的左子樹的子結構,或者A的右子樹的子結構

,因此我們不能單單從 check(A,B)的結果就判斷B是否為A的子結構。我們還需要判斷 B是否為A的左子樹/右子樹的子結構,因此我們還需要遞迴呼叫主方法

    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(A==null||B==null){
           return false;
        }
        //遞迴呼叫主方法,檢視是否為左右子樹的子結構(只要滿足一種情況即可)
        return check(A,B)||isSubStructure(A.left,B)||isSubStructure(A.right,B);
    }