1. 程式人生 > >【LeetCode 簡單題】117-二叉搜尋樹中的眾數

【LeetCode 簡單題】117-二叉搜尋樹中的眾數

宣告:

今天是第117道題。給定兩個沒有重複元素的陣列 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下一個比其大的值。nums1 中數字 x 的下一個更大元素是指 x 在 nums2 中對應位置的右邊的第一個比 大的元素。如果不存在,對應位置輸出-1。以下所有程式碼經過樓主驗證都能在LeetCode上執行成功,程式碼也是借鑑別人的,在文末會附上參考的部落格連結,如果侵犯了博主的相關權益,請聯絡我刪除

(手動比心ღ( ´・ᴗ・` ))

正文

題目:給定一個有相同值的二叉搜尋樹(BST),找出 BST 中的所有眾數(出現頻率最高的元素)。

假定 BST 有如下定義:

  • 結點左子樹中所含結點的值小於等於當前結點的值
  • 結點右子樹中所含結點的值大於等於當前結點的值
  • 左子樹和右子樹都是二叉搜尋樹

例如:
給定 BST [1,null,2,2],

   1
    \
     2
    /
   2

返回[2].

提示:如果眾數超過1個,不需考慮輸出順序

進階:你可以不使用額外的空間嗎?(假設由遞迴產生的隱式呼叫棧的開銷不被計算在內)

解法1。常規思路,遍歷整個二叉樹,把元素及其出現頻數放到字典裡,結束後遍歷該字典找出頻數最大對應的鍵並返回,程式碼如下。

執行用時: 88 ms, 在Find Mode in Binary Search Tree的Python3提交中擊敗了78.53% 的使用者

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution():
    max_count = 0
    def FindMode(self,root):
        res = []
        res_map = {}
        if not root:
            return []
        self.dfs(root,res_map)
        for key,value in res_map.items():
            if value == self.max_count:
                res.append(key)
        return res
    
    def dfs(self,root,res_map):
        if not root:
            return
        # 中序遍歷,左-根-右
        self.dfs(root.left,res_map)
        res_map[root.val] = res_map.get(root.val,0)+1
        self.max_count = max(self.max_count,res_map[root.val])
        self.dfs(root.right,res_map)

 

結尾

解法1:https://unclegem.cn/2018/08/26/Leetcode%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0-501-%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E4%B8%AD%E7%9A%84%E4%BC%97%E6%95%B0/