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

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

  • 说明
    所有节点的值都是唯一的。
    p、q 为不同节点且均存在于给定的二叉树中。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree

思路:写一个辅助的后序遍历递归方法:
当从一个根节点出发,能找到pq节点,则表示该根节点是pq的公共祖先。
当从一个根节点出发,能找到pq节点,并且pq节点不在同一颗子树中,则该节点为最近公告祖先。
pq的位置有三种:当前根节点,左子树,右子树,要求pq出现在这三种情况中的两种,则认为这个节点就是pq的最近公共祖先。

package container;

class TreeNode{
    int val;
    TreeNode left;
    TreeNode right;

    public TreeNode (int val) {
        this.val = val;
    }
}

class Solution {
     //给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 力口236
    //lca表示最近公共祖先
    private TreeNode lca=null;
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
     if (root==null){
         return null;
     }
     //辅助调用一个toFind方法,如果在tofind中找到最近公告祖先就返回给lca。
     toFind(root,p,q);
     return lca;
    }
    
   //从root出发,看看能不能找到pq,找到返回1,找不到返回0
    private boolean toFind(TreeNode root, TreeNode p, TreeNode q) {
        if (root==null){
            return false;
        }
        //递归后序遍历查找pq;
        //pq的位置有三种,左子树,右子树,当前根节点
        int left=toFind(root.left,p,q)?1:0;
        int right=toFind(root.right,p,q)?1:0;
        int mid=(root==p||root==q)?1:0;
        //pq要在3中情况的两个位置,才能判定该节点是lca
       if (left+right+mid==2){
           lca=root;
       }
       //说明有找到
       return left+right+mid>0;
       
    }


}

你可能感兴趣的:(JAVASE)