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

题目链接:https://leetcode-cn.com/problems/er-cha-shu-de-zui-jin-gong-gong-zu-xian-lcof/
找两个节点的最低公共祖先,递归去找
1. 第一种情况,左右子树都有p和q,当前节点为他们的公共祖先
2. 第二种情况,左子树有或者右子树有,公共节点为对应的公共祖先
3. 特殊情况:其中一个节点与根节点相同,最低公共祖先为根节点
时间复杂度和空间复杂度都是O(N)
其中 N 为二叉树节点数;最差情况下,需要递归遍历树的所有节点。
最差情况下,递归深度达到 N ,系统使用 O(N) 大小的额外空间。

递归

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        //递归终止条件
        if(!root || root == p||root == q)   return root;        
        //判断左边有没有p和q两个点
        TreeNode* left = lowestCommonAncestor(root->left, p, q);
        //判断右边有没有p和q两个点
        TreeNode* right = lowestCommonAncestor(root->right, p, q);
        //p和q在左右两边都有,当前这个点就是左右节点的公共祖先
        if(left && right)   return root;
        // 只有一个非空则返回该指针,两个都为空则返回空指针
        return left ? left : right; 
    }
};
posted @ 2020-04-12 09:06  NaughtyCoder  阅读(72)  评论(0)    收藏  举报