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

/**
 * 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;
        TreeNode* L = lowestCommonAncestor(root->left, p, q);
        TreeNode* R = lowestCommonAncestor(root->right, p, q);
        if(!L && !R) return nullptr;
        if(L && R) return root;
        if(L) return L;
        return R;
    }
};

首先考虑递归边界,当根节点为空指针,返回空指针;

若p,q中的一个是根节点,那么p, q的LCA就是根节点。

也就是说,如果当前子树中,但凡有p, q中的一个,就不会返回nullptr

遍历根节点的左右子树,如果返回值L,R都是nullptr,说明p,q既不在当前结点的左子树,也不在当前节点的右子树

如果L,R都不为空,说明p,q一个在左子树,一个在右子树,所以他们的LCA就是当前的根节点

在此基础上,如果L,R并非都是非空,而L是非空,说明p,q都在左子树,则返回L,以L为根节点继续递归,也就是遍历左子树。

同理,如果p,q都在右子树,递归遍历右子树。

 

posted on 2021-02-11 09:37  hannah_id  阅读(71)  评论(0)    收藏  举报

导航