501.二叉搜索树中的众数

71 阅读1分钟

题目:
给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树 算法: 方法一:中序遍历+双指针
    中序遍历转换为升序数组,然后再升序数组中,求众数
func findMode(root *TreeNode) []int {
	ans := make([]int, 0)
	maxCount := 0
	arr := make([]int, 0)
	var dfs func(node *TreeNode)  
	dfs =  func(node *TreeNode) {
		if node == nil {
			return
		}
		dfs(node.Left)
		arr = append(arr, node.Val)
		dfs(node.Right)
	}
	dfs(root)
	fmt.Println(arr)
	pre, i:= 0, 0
	for ; i < len(arr); i ++ {
		if arr[i] != arr[pre] {
			freq := i - pre
			if freq > maxCount {
				ans = []int{arr[pre]}
				maxCount = freq
			} else if freq == maxCount {
				ans = append(ans, arr[pre])
			}
			pre = i
		}
	}
	freq := i - pre
	if freq > maxCount {
		ans = []int{arr[pre]}
		maxCount = freq
	} else if freq == maxCount {
		ans = append(ans, arr[pre])
	}
	return ans
}

方法二:中序遍历
方法一额外生成了长度为n的数组,我们利用中序遍历的特性,相同的数字总是被连续访问到,优化空间使用:

func findMode(root *TreeNode) []int {
	ans := make([]int, 0)
	base, count, maxCount := 0, 0, 0
	var update func (val int)
	update = func(val int) {
		if val == base {
			count ++
		} else {
			base = val
			count = 1
		}

		if count > maxCount {
			maxCount = count
			ans = []int{val}
		} else if count == maxCount {
			ans = append(ans, base)
		}
	}


	var dfs func(node *TreeNode)  
	dfs =  func(node *TreeNode) {
		if node == nil {
			return
		}
		dfs(node.Left)
		update(node.Val)
		dfs(node.Right)
	}
	dfs(root)
	
	return ans
}