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

501. 二叉搜索树中的众数

501. 二叉搜索树中的众数

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

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

假定 BST 满足如下定义:

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

示例 1:
在这里插入图片描述

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

示例 2:

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

提示:

  • 树中节点的数目在范围 [1, 10^4] 内
  • -10^5 <= Node.val <= 10^5

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

解题思路

本人另一篇博客详解该题:https://blog.youkuaiyun.com/YouMing_Li/article/details/142621400

Go代码

/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *     Val int
 *     Left *TreeNode
 *     Right *TreeNode
 * }
 */
func findMode(root *TreeNode) []int {
    // 中序遍历二叉搜索树的结果就是有序的,相同数字会同时连续出现
    if root == nil {
        return nil
    }
    var prevTreeNode *TreeNode // 记录前一个节点
    curTreeNode := root  // 当前遍历的节点
    var maxCount int // 当前为止众数的最大次数
    var curCount int // 当前数字出现的次数
    var res []int // 存放结果

    // 迭代法的中序遍历
    stack := make([]*TreeNode,0)
    for curTreeNode != nil || len(stack) != 0 {
        if curTreeNode != nil {
            stack = append(stack,curTreeNode)
            curTreeNode = curTreeNode.Left // 左
        } else {
            curTreeNode = stack[len(stack) - 1]
            stack = stack[0:len(stack) - 1]
            // 中 处理逻辑
            // 没有前节点,则当前节点是第一个节点,计数为1
            if prevTreeNode == nil { 
                curCount = 1
            } else if curTreeNode.Val == prevTreeNode.Val {
                curCount++
            } else { // 和前一个节点不同了
                curCount = 1
            }

            // 当前数也是众数
            if curCount == maxCount {
                res = append(res,curTreeNode.Val)
            } else if curCount > maxCount { // 当前数是最新的众数
                res = make([]int,0) // 清空之前的所有众数,因为那些都不是最终的众数
                res = append(res,curTreeNode.Val)
                maxCount = curCount // 更新最新众数频率
            }
            prevTreeNode = curTreeNode //更新前一个节点
            
            curTreeNode = curTreeNode.Right // 右
        }
    }

    return res
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值