給定乙個二叉樹,求它的最大搜尋二叉樹的大小
分成三種情況來考慮:
當前節點的左子樹是搜尋二叉樹,而右節點並不是搜尋二叉樹;或者左節點的最大搜尋二叉樹的大小大於右節點的最大搜尋二叉樹的大小,那麼此時最大的搜尋二叉樹就是它的左子樹;
當前節點的右子樹是搜尋二叉樹而左節點不是搜尋二叉樹;又或者左節點的最大搜尋二叉樹的大小小於右節點的最大搜尋二叉樹的大小,那麼此時最大的搜尋二叉樹就是它的右子樹;
當前節點的左子樹和右子樹都是搜尋二叉樹,並且當前節點的值大於左子樹的最大搜尋二叉樹的最大值,小於右子樹的最大搜尋二叉樹的最小值;此時,說明以當前節點為根節點的二叉樹也是一顆搜尋二叉樹;
因為對於每個子樹的判斷邏輯都一致,可以用遞迴實現;但需要注意的是要儲存的每棵樹的資訊有四個:
**如下:
import sys
class
tree()
:def
__init__
(self, value)
: self.value = value
self.right =
none
self.left =
none
class
information_of_subtree()
:def
__init__
(self, max_head, max_value, min_value, length)
: self.max_head = max_head
self.max_value = max_value
self.min_value = min_value
self.length = length
# 主程式
defbiggst_sub_bst_in_tree
(head)
: res = process(head)
return res.max_head
# 遞迴
defprocess
(node)
:if node ==
none
:return information_of_subtree(node,
-sys.maxsize-
1, sys.maxsize,0)
left = process(node.left)
right = process(node.right)
# 第三種情況
if left.max_head == node.left and right.max_head == node.right \
and left.max_value < node.value and right.min_value > node.value:
includeitself = left.length +
1+ right.length
else
: includeitself =
0 max_length =
max(left.length, right.length, includeitself)
#判斷是第一種還是第二種情況
max_head = left.max_head if left.length > right.length else right.max_head
if max_length == includeitself : max_head = node
return information_of_subtree(max_head,
max(left.max_value, right.max_value, node.value)
,min
(left.min_value, right.min_value, node.value)
, max_length)
最大搜尋二叉樹
本題考慮到用遞迴,即遞迴左子樹找到最大搜尋二叉樹的頭結點,遞迴右子樹找到最大搜尋二叉樹的頭結點,對於最大二叉搜尋子樹來說,我們要知道它的頭結點,最大的size 即搜尋二叉子樹的大小 搜尋二叉子樹的最小值,最大值。等於說我們在處理子問題時必須知道這四個引數。我們函式僅返回頭結點,其餘三個引數用全域性陣...
找到二叉樹中的最大搜尋二叉樹
題目 給定一顆二叉樹,已知其中所有節點的值都不一樣,找到含有節點最多的二叉搜尋樹,並返回頭節點。注 乙個二叉樹的子樹的葉節點必須是該二叉樹的葉節點。解答 1.後續遍歷 2.每次記錄下最小值,最大值,節總數。如果root左右節點符合,則總數相加後,返回此根節點 否則返回左右節點中節點數最多的節點。輸入...
二叉樹 還原二叉樹 二叉搜尋樹
先序遍歷的特點 先遍歷根結點,再遍歷左子樹,最後再遍歷右子樹 中序遍歷的特點 先遍歷左子樹,再遍歷根結點,最後再遍歷右子樹 後序遍歷的特點 先遍歷左子樹,再遍歷右子樹,最後再遍歷根結點 舉例 先序遍歷 a b d f g h i e c 中序遍歷 f d h g i b e a c 如上,根據先序遍...