Leetcode 501. 二叉搜索樹中的眾數
- 2019 年 11 月 3 日
- 筆記
題目描述
給定一個有相同值的二叉搜索樹(BST),找出 BST 中的所有眾數(出現頻率最高的元素)。
假定 BST 有如下定義:
- 結點左子樹中所含結點的值小於等於當前結點的值
- 結點右子樹中所含結點的值大於等於當前結點的值
- 左子樹和右子樹都是二叉搜索樹
示例 1:
輸入: 給定 BST [1,null,2,2]
1 2 / 2
返回[2].
解法1
利用二叉搜索樹特性
因為二叉搜索樹的中序遍歷為有序列表,所以相當於在有序列表中,取眾數的值。所以只需要一次遍歷即可獲得每個元素的出現次數,即可獲得眾數。
class Solution(object): def findMode(self, root): """ :type root: TreeNode :rtype: List[int] """ self.maxTimes,self.curTimes=1,0 self.ret,self.lastNode=[],None def addToRet(node): if node: addToRet(node.left) if self.lastNode and self.lastNode.val==node.val: self.curTimes+=1 else: self.curTimes=1 self.lastNode=node if self.curTimes==self.maxTimes: self.ret.append(node.val) elif self.curTimes>self.maxTimes: self.ret,self.maxTimes=[],self.curTimes self.ret.append(node.val) addToRet(node.right) addToRet(root) return self.ret
解法2
作為普通二叉樹處理
遍歷二叉樹,將出現次數保存在map對象中,若次數等於最大出現次數,則添加元素到ret結果集中;若高於最大出現次數,則更新最大次數並清除結果集,重新添加當前元素。
class Solution(object): def findMode(self, root): """ :type root: TreeNode :rtype: List[int] """ self.maxTimes=1 self.map,self.ret=dict(),set() def addToRet(node): if node: addToRet(node.left) num=self.map.get(node.val,0)+1 self.map[node.val]=num if num==self.maxTimes: self.ret.add(node.val) elif num>self.maxTimes: self.ret.clear() self.ret.add(node.val) self.maxTimes=num addToRet(node.right) addToRet(root) return list(self.ret)
