二叉树的最近公共祖先
今天在复习时,这道题又一次没有做出来,为了加深记忆,于是写下这篇题解
- 通过儿子的方式建树
思路分析
- 针对一个节点,如果我们想知道,他是不是该点的祖先我们需要知道该点是否在子树中即可
- 最近:说明我们需要进行后序遍历,从下到上找,才能找到最近公共祖先
- 针对最近公共祖先,一共有三种情况
- 具体思路
- 返回值:我们需要知道p,q在不在左右子树中,所以如果有pq则返回pq,否则我们返回 null 表示不存在
- 搜索中的情况(单层逻辑)
- 针对 当前 搜索点 root 我们如何判断 p q 是否在当前子树中
left | right | 返回值 |
---|---|---|
null | null | 毫无疑问返回null,左右子树中都没有p,q |
p | null | 返回p,向root的父节点说明p在 root的子树中 (q同理) |
null | p | 返回p,向root的父节点说明p在 root的子树中(q同理) |
p(q) | q(p) | 情况1说明root为最近根节点返回 root |
class Solution {
public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
return dfs(root,p,q);
}
TreeNode dfs(TreeNode root,TreeNode p,TreeNode q){
//1.递归终止条件,root为null,p,q 则直接返回,无需向下搜索
if(root==null || root==p || root==q)return root;
//2.如果不满足1,则需要继续向下搜索
TreeNode left=dfs(root.left,p,q);
TreeNode right=dfs(root.right,p,q);
//对于root的父节点,我们需要返回以root为根节点的子树中是否有 p,q
if(left==null)return right;//right=null,p,q都可以直接返回righr;
if(right==null)return left;//同上个判断
//可以到这,说明,left,right都不为空 返回root,作为答案
return root;
}
}
小思考