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

  1. 借助一个辅助函数, 在 root 中递归查找 p 和 q.
    设定辅助函数的返回值, 如果找到返回 1(找到一个或者两个都算), 没找到 返回 0
  2. 这个递归查找的过程进一步拆解开. 递归在左子树中查找 + 递归在右子树中查找 + 对比根节点
  3. 如果这三个位置中, 有两个地方找到了, 这个当前节点就是要找的最近公共祖先
  private TreeNode lca = null;
    public TreeNode lowestCommonAncestor(TreeNode root,TreeNode p,TreeNode q){
        if(root == null){
            return null;
        }
        findNode(root,p,q);
        return lca;
    }
    private boolean findNode(TreeNode root,TreeNode p,TreeNode q){
        if(root == null){
            return false;
        }
        int left = findNode(root.left,p,q)?1:0;
        int right = findNode(root.right,p,q)?1:0;
        int mid = (root == p || root == q)?1:0;
        if(left + right + mid >= 2){
            lca = root;
        }
        return (left + right + mid)>0;
    }

你可能感兴趣的:(学习)