这是我参与2022首次更文挑战的第18天,活动详情查看:2022首次更文挑战
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 输出:3 解释:节点 5 和节点 1 的最近公共祖先是节点 3 。
最近可能和树杠上了
首先我们要注意到一个细节就是我们对最近公共祖先的定义,
就我们熟知的两种遍历,一种是深度,一种是广度,我们是向下去寻找我们的子节点,这种方式与我们的深度遍历十分类似,所以我们可以考虑使用递归的方式来解决
那我们就分析一下我们会出现的几种情况,
如果存在p,q节点
- p,q在我们此节点的两侧
- p,q在一侧(包含p或q是root节点
我们使用深度遍历的方式去寻找我们节点,如果发现就返回节点
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
//找到我们的节点,并返回
if(root==null||root==p||root==q) return root;
//左子树寻找
TreeNode left = lowestCommonAncestor(root.left,p,q);
//右子树寻找
TreeNode right = lowestCommonAncestor(root.right,p,q);
//返回不为空的一侧
if(left==null) return right;
if(right==null) return left;
//此时两侧都不为空了,pq在此节点两侧,此节点为最近公共祖先
return root;
}
其实吧,这道题就在深度遍历上稍微加了一些改动,我们先向下寻找,找到之后我们把数值向上返回,使两边都不为空,就是我们最近的公共祖先了。