二叉樹問題 找到二叉樹中的最大搜尋二叉子樹

2021-08-04 15:11:54 字數 1607 閱讀 9952

題目:

給定一棵二叉樹的頭節點head,已知其中所有節點的值都不一樣,找到含有節點最多的搜尋二叉樹,並返回這棵子樹的頭節點。(注意子樹的概念)

基本思路:

以節點node為頭的樹中,最大的搜尋二叉樹只可能來自以下的兩種情況:  

node的左子樹和右子樹都是搜尋二叉樹,並且左子樹的最大值小於node,右子樹的最小值大於node,此時,以node為頭的整棵樹都是搜尋二叉樹。

如果不滿足情況1,那麼最大的搜尋二叉樹來自node左子樹的最大搜尋二叉子樹或者node右子樹的最大搜尋二叉子樹

整體過程是二叉樹的後序遍歷,過程如下:

遍歷到當前節點cur時,先遍歷左子樹收集四個資訊,分別是左子樹上最大搜尋二叉樹的頭節點(lbst),節點數(lsize),最大值(lmax)和最小值(lmin)。再遍歷右子樹,也收集四個資訊rbst, rsize, rmax, rmin。

根據步驟一收集的資訊,判斷是否滿足情況1,如果滿足,返回cur。如果不滿足,返回lbst, rbst中最大的乙個。

def

biggestsubbst

(root):

deffindbiggestsubbst

(root, record):

ifnot root:

record[0] = 0

record[1] = sys.maxsize

record[2] = -sys.maxsize

return

none

leftbst = findbiggestsubbst(root.left, record)

leftsize = record[0]

leftmin = record[1]

leftmax = record[2]

rightbst = findbiggestsubbst(root.right, record)

rightsize = record[0]

rightmin = record[1]

rightmax = record[2]

record[1] = min(leftmin, int(root.val))

record[2] = max(rightmax, int(root.val))

if leftbst == root.left and rightbst == root.right and \

rightmin > int(root.val) and leftmax < int(root.val):

record[0] = leftsize + rightsize + 1

return root

record[0] = max(leftsize, rightsize)

if leftsize > rightsize:

return leftbst

else:

return rightbst

ifnot root:

return

record = [0

for i in range(3)]

return findbiggestsubbst(root, record)

找到二叉樹中的最大搜尋二叉樹

題目 給定一顆二叉樹,已知其中所有節點的值都不一樣,找到含有節點最多的二叉搜尋樹,並返回頭節點。注 乙個二叉樹的子樹的葉節點必須是該二叉樹的葉節點。解答 1.後續遍歷 2.每次記錄下最小值,最大值,節總數。如果root左右節點符合,則總數相加後,返回此根節點 否則返回左右節點中節點數最多的節點。輸入...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

樹 找到二叉樹中的最大二叉搜尋樹

題目 給定一顆二叉樹,已知其中所有節點的值都不一樣,找到含有節點最多的二叉搜尋樹,並返回頭節點。注 乙個二叉樹的子樹的葉節點必須是該二叉樹的葉節點。解答 以節點root為頭的樹中,最大的二叉搜尋樹只可能來自以下兩種情況。1.如果來自root左子樹上的最大st以root.left為頭,來自root右子...