剑指 Offer 68 - II. 二叉树的最近公共祖先

剑指 Offer 68 - II. 二叉树的最近公共祖先

同理,由于给定的是二叉树,所以只有两个方向上的选择,对于p,q的公共祖先,如果p,q分别在root的一左一右,那么显然root就是最近的公共祖先,否则,就只有在同一侧了,如果在哪侧,就继续去遍历那一侧即可。

/**
 * 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) {
        if(root == null || root == p || root == q) {
            return root;
        }
        var left = lowestCommonAncestor(root.left, p, q);
        var right = lowestCommonAncestor(root.right, p, q);
        if(left != null && right != null) {
            return root;
        } else if(left != null && right == null) {
            return left;
        } else if(left == null && right != null){
            return right;
        } else {
            return null;
        }

    }
}

时间复杂度平均为\(O(logn)\),最差退化到链表,\(O(n)\),空间复杂度为\(O(1)\)

posted @ 2022-02-02 23:30  NullPointer_C  阅读(34)  评论(0)    收藏  举报