題目:
給定一棵二叉樹的頭節點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右子...