【Leetcode千题】501. 二叉搜索树中的众数

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。

假定 BST 有如下定义:

结点左子树中所含结点的值小于等于当前结点的值
结点右子树中所含结点的值大于等于当前结点的值
左子树和右子树都是二叉搜索树
例如:
给定 BST [1,null,2,2],

1
\
2
/
2
返回[2].

提示:如果众数超过1个,不需考虑输出顺序

进阶:你可以不使用额外的空间吗?(假设由递归产生的隐式调用栈的开销不被计算在内)

思路

可以直接中序遍历,相当于得到一个顺序的数组,只要判断当前数字与前一个是否相同,相同就让当前数字的个数加一,然后判断是否达到了最大的数目,是就放入ans,超过就清空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 = []
        most = 0
        counts = 0
        last = None
        def search(t):
            nonlocal ans,most,counts,last#声明外函数局部变量
            if not t:#当前节点无,直接返回
                return
            if t.left:#遍历左子树
                search(t.left)
            if t.val == last:
                counts+=1
            else:
                counts=1
            if counts == most:
                ans.append(t.val)
            elif counts>most:
                most = counts
                ans = [t.val]
            last = t.val
            if t.right:#遍历右子树
                search(t.right)
        search(root)
        return ans
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值