榮耀 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的右子樹的子結構
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); }