描述:
给定二叉树两个节点,求其最近公共祖先。最近即所有公共祖先中深度最深的。
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放到最后,时间会慢不少。