LeetCode 501. 二叉搜索树中的众数

题目

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有众数(即,出现频率最高的元素)。如果树中有不止一个众数,可以按任意顺序返回。
假定 BST 满足如下定义:结点左子树中所含节点的值小于等于当前节点的值,结点右子树中所含节点的值大于等于当前节点的值,左子树和右子树都是二叉搜索树

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

方法:递归

根据二叉搜索树的特性我们可知,以中序遍历的方式可以得到该树由小到大的元素值,所以只有临近的节点值可能相同
__ init __ 部分:定义

  • pre 表示上一个节点
  • count 表示此时节点值的出现次数
  • max_count 表示节点值的最大出现次数
  • result 所有节点出现次数等于最大出现次数的节点值

findMode 部分:

  • 判断是否为空树
  • 开始进行记录和查找出现次数最多的节点值
  • 返回所有出现频率最高的元素的值

search 部分:

  • 判断是否为空节点
  • 调用 search 函数,对左子树进行遍历
  • 若节点为第一个节点,即不存在上一个节点,那么该节点值的出现次数一定为一;若节点值等于上一个节点值,那么该节点值的出现次数加一;若节点值不等于上一个节点值,那么该节点的出现次数一定为一
  • 因为节点可以通过函数的参数传递,但是上一个节点并不可以,所以为了后续的遍历需要手动将此时节点变成上一个节点
  • 若节点的出现次数等于最大出现次数,那么该节点值可以移入 result 列表中;若节点的出现次数大于最大出现次数,那么 result 列表清空,同时将该节点值移入 result 列表中
  • 调用 search 函数,对右子树进行遍历
# 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 = TreeNode()
        self.count = 0
        self.max_count = 0
        self.result = []

    def findMode(self, root):
        if not root:
            return None
        self.search(root)
        return self.result

    def search(self, node):
        if not node:
            return None
        
        self.search(node.left)

        if not self.pre:
            self.count = 1
        elif self.pre.val == node.val:
            self.count += 1
        else:
            self.count = 1
        self.pre = node
        
        if self.count == self.max_count:
            self.result.append(node.val)
        if  self.count> self.max_count:
            self.max_count = self.count
            self.result = [node.val]

        self.search(node.right)
参考

代码相关:https://programmercarl.com/0501.%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.html

你可能感兴趣的:(LeetCode 501. 二叉搜索树中的众数)