leetcode236-二叉树的最近公共祖先

原题

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉树:  root = [3,5,1,6,2,0,8,null,null,7,4]

leetcode236-二叉树的最近公共祖先

示例1:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出: 3
解释: 节点 5 和节点 1 的最近公共祖先是节点 3。

示例2:

输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出: 5
解释: 节点 5 和节点 4 的最近公共祖先是节点 5。因为根据定义最近公共祖先节点可以为节点本身。

解法

思想

我首先的思路就是要有一个reach函数,可以判断一个节点是不是指定节点的祖先,通过dfs实现,返回一个bool值。
那么这道题要寻找离p、q最近的祖先节点,就可以再使用一个dfs,我们都知道dfs回溯的时候是从下往上的,那么只要调用函数最早对参数p、q都返回true的节点就是要得到的答案了,然后沿着回溯返回值链传回这个节点。

代码

class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root == null) return null;
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        if(left!=null) return left;
        TreeNode right = lowestCommonAncestor(root.right,p,q);
        if(right!=null) return right;
        if(reach(root,p.val)==true&&reach(root,q.val)==true) return root;
        return null;
    }
    public boolean reach(TreeNode root,int value){
        if(root == null) return false;
        if(root.val == value) return true;
        return reach(root.left,value) || reach(root.right,value);
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode236-%e4%ba%8c%e5%8f%89%e6%a0%91%e7%9a%84%e6%9c%80%e8%bf%91%e5%85%ac%e5%85%b1%e7%a5%96%e5%85%88/