【代码随想录】刷题记录(61)-二叉搜索树中的众数

题目描述:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

 

示例 1:

 

2d6ea5d5a756c203cd1ce763cf7b4603.jpeg

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

 

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

 

我的作答:

二叉树也逐渐模版化了,整体思路和【代码随想录】刷题记录(60)-二叉搜索树的最小绝对差 一样,其实根据二叉树的特性,众数只会出现在相邻的元素中,一旦发现这一个结点和下一个结点的值不同,这个结点的值就不会再出现了;

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def __init__(self):
        self.pre = None
        self.count = 0
        self.countMax = 0
        self.res = []

    def findMode(self, root):
        """
        :type root: Optional[TreeNode]
        :rtype: List[int]
        """
        if not root:
            return None
        self.findMode(root.left) #左
        if not self.pre: #中
            self.count = 1
        elif self.pre.val==root.val:
            self.count += 1
        else:
            self.count = 1
        self.pre = root
        if self.count==self.countMax:
            self.res.append(root.val) #相同次数的众数
        elif self.count>self.countMax:
            self.res = [] #清空原数组
            self.countMax = self.count
            self.res.append(root.val)
        self.findMode(root.right) #右
        return self.res

cae2d3ec7c8b4eae9fe0b6a77e8620fb.png

 

参考代码:迭代法(看了很多次,没动手写过一次。。)

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findMode(self, root):
        st = []
        cur = root
        pre = None
        maxCount = 0  # 最大频率
        count = 0  # 统计频率
        result = []

        while cur is not None or st:
            if cur is not None:  # 指针来访问节点,访问到最底层
                st.append(cur)  # 将访问的节点放进栈
                cur = cur.left  # 左
            else:
                cur = st.pop()
                if pre is None:  # 第一个节点
                    count = 1
                elif pre.val == cur.val:  # 与前一个节点数值相同
                    count += 1
                else:  # 与前一个节点数值不同
                    count = 1

                if count == maxCount:  # 如果和最大值相同,放进result中
                    result.append(cur.val)

                if count > maxCount:  # 如果计数大于最大值频率
                    maxCount = count  # 更新最大频率
                    result = [cur.val]  # 很关键的一步,不要忘记清空result,之前result里的元素都失效了

                pre = cur
                cur = cur.right  # 右

        return result

4b515146dbd649aea8413cc3664dd9bb.png

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值