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

2023-05-13,,

描述:

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

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放到最后,时间会慢不少。

leetcode 235 236 二叉树两个节点的最近公共祖先的相关教程结束。

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

下载本文的Word格式文档,以方便收藏与打印。