Leetcode501. 二叉搜索树中的众数 Find Mode in Binary Search Tree - Python 递归法

47 篇文章 0 订阅
4 篇文章 0 订阅

法一:利用二叉搜索树有序特性,中序遍历为有序数组,然后用哈希表统计频率,再将高频的众数返回即可。

法二:利用二叉搜索树特性,边遍历,边比较。

补充:如果不是二叉搜索树,而是普通二叉树,那么最直观的方法一定是把这个树都遍历了,得到有序数组。用哈希表map统计频率,把频率排个序,最后取前面高频的元素的集合。

递归法(法二):

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        maxCount = 0
        count = 0
        pre = None
        result = []
        def traversal(root: Optional[TreeNode]):
            nonlocal count, maxCount, pre, result
            if not root:
                return
            traversal(root.left)
            
            #统计频率
            if pre == None: count = 1  #第一个节点执行
            elif pre.val == root.val: count += 1 #第一个节点之后的节点执行
            else: count = 1 #同上
            
            #将下一个节点给到前节点
            pre = root
   
            #统计频率,频率相等的众数Mode放进result
            if count == maxCount:
                result.append(root.val)
            #若出现更高频的Mode,则需将之前的Mode都清除,从新插入新Mode
            if count > maxCount:
                maxCount = count
                result.clear()
                result.append(root.val)

            traversal(root.right)
        
        traversal(root)
        return result

迭代法:

注意迭代法的写法:

cur = root
stack = []

while cur or stack:
    
    if cur:
        stack.append(cur)
        cur = cur.left #把左放进stack
    else:
        cur = stack.pop() #从stack中弹出中

        #对中的操作
        
        cur = cur.right #把右放进stack
# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findMode(self, root: Optional[TreeNode]) -> List[int]:
        maxCount = 0
        count = 0
        pre = None
        result = []
        cur = root
        stack = []

        while cur or stack:
            if cur:
                stack.append(cur)
                cur = cur.left  #左
            else:
                #弹出中
                cur = stack.pop()
                
                #对中的操作  与递归法对中的操作一样
                if pre == None: count = 1
                elif pre.val == cur.val: count += 1
                else: count = 1

                pre = cur

                if count == maxCount:
                    result.append(cur.val)
                if count > maxCount:
                    maxCount = count
                    result.clear()
                    result.append(cur.val)

                cur = cur.right  #右

        return result

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值