劍指offer 判斷B樹是否是A樹的子結構

2021-09-02 23:23:31 字數 2107 閱讀 1039

題目描述

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)

一道蠻有意思的題,一開始理解錯題意了,只考慮了b樹完全覆蓋了a中某棵子樹,並且以為一定存在根節點相同就完全匹配b樹的子樹。然後想著只要從a樹根節點往下遍歷直到找到乙個節點與b的根節點匹配即可。。。。還是想的太簡單。

正確的題意是,再給出的a樹中,任意乙個部分,一段子樹,該子樹不一定延伸到葉子節點,這段子樹與b樹完全匹配,那麼就不止是根節點的匹配,找到匹配的根節點後再繼續使得兩棵樹的指標同時下移,乙個乙個比較該子樹的每個節點是否都與b樹相同

有乙個不同即放棄以該根節點形成的子樹。

如圖所示,a樹的根節點8是與b樹根節點相同的,但其子樹並不完全與b樹相同,再者,a樹左子樹中有一部分與b樹完全相同,但是並不是整顆子樹完全相同,僅僅是一部分,那麼就要從中挑出來與b樹進行一一比對。

首先想到的思路即,遞迴查詢a樹中是否有某個節點的值與b樹根節點一樣,若一樣,則認為該節點形成的子樹可能包含了b,於是進入judge函式中,同時移動兩棵子樹上的指標,一一判斷左右兒子的節點是否相同,相同則繼續比較,不同直徑返回false,另找其他的可能匹配的根節點。

如何判斷其完全匹配,對於正在兩棵樹上同時移動的指標來說,若b指向的節點不存在了,那麼說明b已經遍歷完了該條路徑上的所有節點,並且沒有與a指向節點不同的值。可以返回true,表示該路徑匹配。如果a指向的節點不存在了,而b指向的節點存在,那麼直接返回false,因為這種情況明顯是b有值而a沒值,匹配不成功,第三種情況就是兩者都有值,比較值是否相等即可。如果相等,同時再向左右兒子擴充套件匹配。

**如下:

/*

struct treenode

};*/

class solution

bool hassubtree

(treenode* proot1, treenode* proot2)

};

給定兩個非空二叉樹 s 和 t,檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的乙個子樹包括 s 的乙個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。

# definition for a binary tree node.

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

check

(self, s, t)

:if t==

none

or s==

none

:return t==s

ans =

false

if s.val == t.val:

ans =

true

else

:return

false

return ans and self.check(s.left,t.left)

and self.check(s.right,t.right)

defissubtree

(self, s: treenode, t: treenode)

->

bool

: ans =

false

if t ==

none

or s==

none

:return

false

if s.val == t.val:

ans = self.check(s,t)

return ans or self.issubtree(s.left,t)

or self.issubtree(s.right,t)

劍指offer 判斷是否是對稱的二叉樹

對於一棵二叉樹,如何判斷這棵二叉樹是否是對稱的二叉樹?例如 從以上的圖中我們可以看出,關於根節點左右對稱的二叉樹就是對稱的二叉樹,那麼在程式中我們需要如何判斷呢?在二叉樹的先序遍歷中,先訪問根結點,再訪問左子樹,再訪問右子樹。如果是對稱的二叉樹,那麼它的左右子樹應該是一樣的,也就是先訪問根,再訪問右...

劍指offer系列之三十八 判斷是否是平衡二叉樹

題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。所謂平衡二叉樹就對某個結點來講,其左子樹的深度與右子樹深度的絕對值不超過1。由於需要對每個節點進行判斷,所以可以採用遞迴的思路進行解決。具體思路是 先求出根節點的左右子樹的深度,並對兩者進行判斷,如果沒有滿足左右子樹的深度的絕對值不超過1的條件...

簡單判斷B樹是否是A樹的子樹

輸入兩棵二叉樹a,b,判斷b是不是a的子結構。ps 我們約定空樹不是任意乙個樹的子結構 public class solution 如果找不到,那麼就再去root的左兒子當作起點,去判斷是否包含tree2 if result 判斷右節點 if result return result public ...