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放到最后,时间会慢不少。
【本文章出自博客园willaty,转载请注明作者出处,误差欢迎指出~】