Java二叉树的最近公共祖先

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

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

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //遍历到p或者q
        if(root == null || root == p || root == q){
            return root;
        }
        TreeNode left = lowestCommonAncestor(root.left,p,q);
        TreeNode right = lowestCommonAncestor(root.right,p,q);

        //左侧没有公共祖先,说明都在右侧(右侧为空时返回null)
        if(left == null){
            return right;
        }
        if(right == null){
            return left;
        }
        //左侧,右侧同时不为空,说明左侧右侧各有一个,返回root
        return root;

    }
}

执行用时:6 ms, 在所有 Java 提交中击败了100.00%的用户

内存消耗:41.8 MB, 在所有 Java 提交中击败了30.93%的用户

通过测试用例:31 / 31

你可能感兴趣的:(剑指Offer,算法,leetcode,数据结构)