当前位置:   article > 正文

30-树-二叉搜索树中的众数

30-树-二叉搜索树中的众数

这是树的第30篇算法,力扣链接

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

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

假定 BST 满足如下定义:

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

示例 1:

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

 思路可以试试先前序遍历将数字计数,然后遍历map取出来放入到result里面。

  1. func findMode(root *TreeNode) []int {
  2. var result []int
  3. if root == nil {
  4. return result
  5. }
  6. numCount := make(map[int]int)
  7. node := root
  8. stack := []*TreeNode{root}
  9. max := 0
  10. for len(stack) > 0 {
  11. for node != nil {
  12. numCount[node.Val]++
  13. if max < numCount[node.Val] {
  14. max = numCount[node.Val]
  15. }
  16. stack = append(stack, node)
  17. node = node.Left
  18. }
  19. node = stack[len(stack)-1].Right
  20. stack = stack[:len(stack)-1]
  21. }
  22. for num, count := range numCount {
  23. if count == max {
  24. result = append(result, num)
  25. }
  26. }
  27. return result
  28. }

当然,也可以中序遍历获取有序数组,然后处理数字的方式找众数。

  1. func findMode(root *TreeNode) (answer []int) {
  2. var base, count, maxCount int
  3. update := func(x int) {
  4. if x == base {
  5. count++
  6. } else {
  7. base, count = x, 1
  8. }
  9. if count == maxCount {
  10. answer = append(answer, base)
  11. } else if count > maxCount {
  12. maxCount = count
  13. answer = []int{base}
  14. }
  15. }
  16. var dfs func(*TreeNode)
  17. dfs = func(node *TreeNode) {
  18. if node == nil {
  19. return
  20. }
  21. dfs(node.Left)
  22. update(node.Val)
  23. dfs(node.Right)
  24. }
  25. dfs(root)
  26. return
  27. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/180325
推荐阅读
相关标签
  

闽ICP备14008679号