题目:
给你一个含重复值的二叉搜索树(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
}