給定乙個有相同值的二叉搜尋樹(bst),找出 bst 中的所有眾數(出現頻率最高的元素)。假定 bst 有如下定義:
結點左子樹中所含結點的值小於等於當前結點的值 結點右子樹中所含結點的值大於等於當前結點的值 左子樹和右子樹都是二叉搜尋樹 例如: 給定
bst [1,null,2,2],1\
2/2返回[2].
:# 中序遍歷bst
ls =
definorder
(node: treenode):if
not node:
return
if node:
# 先遍歷當前結點的左子樹
inorder(node.left)
# 然後遍歷當前結點
# 最後遍歷當前結點的右子樹
inorder(node.right)
if root:
inorder(root)
ans =
iflen
(ls)==0
:return ans
# 統計眾數
cnt =
1 most =
1 ans =
[ls[0]
]for i in
range(1
,len
(ls)):
if ls[i]
== ls[i-1]
: cnt +=
1if cnt == most:
)elif cnt > most:
most = cnt
ans =
[ls[i]
]else
:continue
else
: cnt =
1if cnt == most:
(cnt, most)
return ans
補充:# definition for a binary tree node.
# class treenode:
# def __init__(self, x):
# self.val = x
# self.left = none
# self.right = none
class
solution
:def
findmode
(self, root: treenode)
-> list[
int]
: ans =
cnt =
0 most =
0 last =
none
# 中序遍歷bst,相當於公升序排序
definorder
(node: treenode)
:# 當前結點為空,直接返回
ifnot node:
return
# 設定變數nonlocal,呼叫上層變數
nonlocal ans, cnt, most, last
# 左子樹不為空,先去遍歷左子樹
if node.left:
inorder(node.left)
# 遍歷當前結點
# 如果當前結點的值等於上乙個值
if node.val == last:
# 計數器加1
cnt +=
1else
:# 否則重新開始計數
cnt =
1# 比較計數器和當前出現的最多次數
# 如果相等,表明眾數不止乙個
if cnt == most:
# 如果當前的值出現的次數較多
elif cnt > most:
# 更新most值
most = cnt
# 更新ans
ans =
[node.val]
# 比較完成後,更新last為當前結點的值
last = node.val
# 如果右子樹不為空,繼續遍歷右子樹
if node.right:
inorder(node.right)
inorder(root)
return ans
leetcode 501 二叉搜尋樹中的眾數
給定乙個有相同值的二叉搜尋樹 bst 找出 bst 中的所有眾數 出現頻率最高的元素 假定 bst 有如下定義 結點左子樹中所含結點的值小於等於當前結點的值 結點右子樹中所含結點的值大於等於當前結點的值 左子樹和右子樹都是二叉搜尋樹 例如 給定 bst 1,null,2,2 返回 2 高階 你可以不...
Leetcode 501 二叉搜尋樹中的眾數
給定乙個有相同值的二叉搜尋樹 bst 找出 bst 中的所有眾數 出現頻率最高的元素 假定 bst 有如下定義 例如 給定 bst 1,null,2,2 1 2 2返回 2 提示 如果眾數超過1個,不需考慮輸出順序 高階 你可以不使用額外的空間嗎?假設由遞迴產生的隱式呼叫棧的開銷不被計算在內 使用額...
LeetCode 501 二叉搜尋樹中的眾數
給定乙個有相同值的二叉搜尋樹 bst 找出 bst 中的所有眾數 出現頻率最高的元素 假定 bst 有如下定義 結點左子樹中所含結點的值小於等於當前結點的值 結點右子樹中所含結點的值大於等於當前結點的值 左子樹和右子樹都是二叉搜尋樹 例如 給定 bst 1,null,2,2 1 2 2返回 2 高階...