劍指Offer刷題筆記 樹的子結構

2021-09-25 23:19:31 字數 2144 閱讀 5858

輸入兩顆二叉樹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...