劍指 Offer 26 樹的子結構

2022-09-04 21:06:12 字數 2352 閱讀 8113

第一次接觸二叉樹的遞迴型別的題目。 一般對於這種題目,我們需要做的是: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(a==null||a.val!=b.val)

//特殊情況,遞迴,檢視左子樹和右子樹是否構成子結構

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)

//遞迴呼叫主方法,檢視是否為左右子樹的子結構(只要滿足一種情況即可)

劍指 offer 28. 對稱的二叉樹   基本思路和上面一致。

遞迴方法是 judge(treenode left,treenode right),用於判斷兩個結點是否是對稱的。基本情況:1. left==null && right==null,不影響是否對稱,返回 true。2. left==null || right==null || left.val != right.val ,說明left和right是不對稱的,返回 false。   特殊情況:left.val == right.val,此時還不能判斷是否對稱,要繼續判斷子樹,也就是  judge(left.left,right.right) && judge(left.right,right.left)。

public

boolean

judge(treenode left,treenode right)

if(left==null||right==null||left.val!=right.val)

return judge(left.left,right.right)&&judge(left.right,right.left);

}

判斷完特殊情況後,直接呼叫遞迴方法即可。與上面的題不同的地方在於,我們不需要遞迴呼叫主方法,因為對稱是從根節點開始的,如果題目說某個子樹對稱,那麼我們還需要遞迴呼叫。

public

boolean

issymmetric(treenode root)

return

judge(root.left,root.right);

}

劍指offer26 樹的子結構

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。約定空樹不是任意乙個樹的子結構 b是a的子結構,即 a中有出現和b相同的結構和節點值。例如 給定的樹 a 3 4 5 1 2 給定的樹 b 4 1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。示例 1 輸入 a 1,2,3 b 3,...

劍指 Offer 26 樹的子結構

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。約定空樹不是任意乙個樹的子結構 b是a的子結構,即 a中有出現和b相同的結構和節點值。例如 給定的樹 a 3 4 5 1 2 給定的樹 b 4 1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。示例 1 輸入 a 1,2,3 b 3,...

劍指 Offer 26 樹的子結構

輸入兩棵二叉樹a和b,判斷b是不是a的子結構。約定空樹不是任意乙個樹的子結構 b是a的子結構,即 a中有出現和b相同的結構和節點值。例如 給定的樹 a 3 4 5 1 2 給定的樹 b 4 1返回 true,因為 b 與 a 的乙個子樹擁有相同的結構和節點值。definition for a bin...