輸入兩顆二叉樹a,b,判斷b是不是a的子結構。(ps:我們約定空樹不是任意乙個樹的子結構)。
這題思路還是挺清晰的:遞迴比較兩個樹的結點值。
hassubtree函式主要是在a裡找b的根節點。找到了之後用issame函式比較兩個子樹。兩個函式都是遞迴呼叫的,但是要注意邏輯的順序:用result變數記錄搜尋的狀態。如果根結點下子樹不同,搜尋左子樹,如果搜尋左子樹沒有找到,再搜尋右子樹。
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
def hassubtree(self, proot1, proot2):
# write code here
result = false
if proot1==none or proot2==none:
return false
if proot1.val == proot2.val:
result = self.issame(proot1,proot2)
if not result:
result = self.hassubtree(proot1.left, proot2)
# 判斷左子樹沒找到,接著找右子樹。
# 如果沒有這個判斷,右子樹結果會覆蓋左子樹結果。
if not result:
result = self.hassubtree(proot1.right, proot2)
return result
def issame(self,proot1,proot2):
# 必須先判斷b,如果ab同時為空,先判斷a樹返回為假
if proot2==none:
return true
# 如果a樹為空,b不為空,就得提前退出
if proot1== none:
return false
if proot1.val == proot2.val:
# 這是需要判斷數值是不是相等,所以二者之間沒有關係。
p1 = self.issame(proot1.left,proot2.left)
p2 = self.issame(proot1.right,proot2.right)
else:
return false
# 返回是這個子樹是不是相等,所以左右子樹要取交集
return p1 and p2
下面這是網上大神的**,思路是一樣的,但是簡潔了很多。
# -*- coding:utf-8 -*-
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class solution:
def hassubtree(self, proot1, proot2):
# write code here
if not proot1 or not proot2:
return false
# 這一坨返回的意思是有三種情況:當前結點就是b的根結點、在左子樹里找、在右子樹里找。
return self.hassubtree(proot1.left, proot2) or self.hassubtree(proot1.right, proot2) or self.is_subtree(proot1, proot2)
def is_subtree(self, a, b):
if not b:
return true
if not a or a.val != b.val:
return false
return self.is_subtree(a.left, b.left) and self.is_subtree(a.right, b.right)
劍指offer刷題筆記
給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如,5 3 7 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。struct treenode class solution treenode kthnode treenode proot,int k 非遞迴實現 class solution...
劍指offer刷題
面試題6 從尾到頭列印鍊錶 struct listnode class solution reverse res.begin res.end return res 替換空格class solution int newnumstr numstr numspace 2 if newnumstr leng...
劍指offer刷題
原題鏈結 動態規劃 class solution dp for int i 1 i len1 i else if p j 1 else return dp len1 len2 原題鏈結 數學推導 找規律 class solution else if n 3 2 return ipow 3 numso...