leetcode 235 236 二叉树两个节点的最近公共祖先

描述:

给定二叉树两个节点,求其最近公共祖先。最近即所有公共祖先中深度最深的。

ps:自身也算自身的祖先。

235题解决:

这是二叉搜索树,有序的,左边小右边大。

TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
    if (root == NULL || root == p || root == q)
        return root;
    
    if ((root->val > p->val && root->val < q->val) ||    //p和q在root的左右两边
         root->val < p->val && root->val > q->val)
        return root;
    
    if (p->val < root->val && q->val < root->val)    // p和q都小于root,则结果在左边
        return lowestCommonAncestor(root->left, p, q);
    else
        return lowestCommonAncestor(root->right, p, q);
}

236题解决:

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)    // p和q在root的两边
        return root;
    return l?l:r;  // 返回某一非NULL的一边

Aha:

其实还有一些优化可以在编译期层或概率层,如第一个if中的三个或,根据树的深度和测试数量,或发生的概率进行调整,顺序可以优化。

如第一个if判断,如果把!root放到最后,时间会慢不少。

posted on 2018-01-04 12:05  willaty  阅读(951)  评论(0编辑  收藏  举报

导航