題目描述
輸入兩棵二叉樹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 ...