坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day18
二叉树的最近公共祖先
- 题目描述
- 解题思路
- 最近公共祖先
- 分类讨论
- 当前节点是空节点(返回当前节点)
- 当前节点是p(返回当前节点)
- 当前节点是q(返回当前节点)
- 其他:是否找到p或q
- 左右子树都找到(返回当前节点)
- 只有左子树找到(返回递归左子树的结果)
- 只有右子树找到(返回递归右子树的结果)
- 左右子树都没有找到(返回空节点)
- 代码参考
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if root == nil || root == p || root == q{
return root
}
left := lowestCommonAncestor(root.Left,p,q)
right := lowestCommonAncestor(root.Right,p,q)
if left != nil && right != nil{
return root
}
if left != nil{
return left
}else{
return right
}
}
- tips
- 注意go中的false条件不能省略写,一定要写成==nil的形式来判断
二叉搜索树的最近公共祖先
- 题目描述
- 解题思路
- 可以剪枝
- 题目保证p和q都在树中,根节点肯定不是空节点,所以不需要判断当前节点是空节点的情况
- 分类讨论yyds!(见下图)
- 代码参考
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func lowestCommonAncestor(root, p, q *TreeNode) *TreeNode {
if q.Val<root.Val && p.Val<root.Val{
return lowestCommonAncestor(root.Left,p,q)
}else if q.Val>root.Val && p.Val>root.Val{
return lowestCommonAncestor(root.Right,p,q)
}else{
return root
}
if root == p || root == q{
return root
}
return root
}