今天的题好难啊,也许是今天太困了,醒的早睡不着。
给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
func getMinimumDifference(root *TreeNode) int {
var prev *TreeNode
min:=math.MaxInt64
var travel func (node* TreeNode)
travel = func(node *TreeNode){
if node == nil{return }
travel(node.Left)//左
if prev!=nil && node.Val-prev.Val<min{//当前节点与前一个节点的差值记录
min = node.Val -prev.Val
}
prev = node //保存根的信息
travel(node.Right)//右
}
travel(root)
return min
}
给你一个含重复值的二叉搜索树(BST)的根节点 root
,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。
如果树中有不止一个众数,可以按 任意顺序 返回。
假定 BST 满足如下定义:
- 结点左子树中所含节点的值 小于等于 当前节点的值
- 结点右子树中所含节点的值 大于等于 当前节点的值
- 左子树和右子树都是二叉搜索树
func findMode(root *TreeNode) []int { res := make([]int, 0) count := 1 max := 1 var prev *TreeNode var travel func(node *TreeNode) travel = func(node *TreeNode) { if node == nil { return } travel(node.Left) //左 //根 if prev != nil && prev.Val == node.Val {//如果当前元元素与上一个元素相等 就可以进行累加 count++ } else {//否则就是从1开始计数 count = 1 } if count >= max { //count大于说明出现新的众数可能性 if count > max && len(res) > 0 {//大当前 count 并且数组已存在元素 res = []int{node.Val} } else {//如果相等,众数不止一个,纳入数组中 res = append(res, node.Val) } max = count//保存当前的count 进行下一轮比较 } prev = node//保存根节点作为暂存节点 travel(node.Right)//右 } travel(root) return res }
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
func lowestCommonAncestor(root ,p,q *TreeNode)*TreeNode{
if root ==nil{return root}
if root ==p || root ==q{ return root}
lf:=lowestCommonAncestor(root.Left,p,q)
ri:=lowestCommonAncestor(root.Right,p,q)
if lf!=nil && ri!=nil{
return root
}
if lf!=nil{
return lf
}
if ri!=nil{
return ri
}
return nil
}