二叉(搜索)树——最近公共祖先
可能是因为做过图论的原因,做这个题的时候直接是最巧妙的解法,
原题1:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-search-tree/
原题2:https://leetcode-cn.com/problems/lowest-common-ancestor-of-a-binary-tree/
是二叉搜索树,甚至没有利用树的特性解题
思路是:
选用递归,
那么return的一定是最近公共祖先
即有语句:如果p、q子节点都有找到,那么root即为最近公共祖先
if (l != nullptr && r != nullptr) return root;
否则,优先选择非空的return
return l != nullptr ? l : r;
巧妙的点在于,如果当前找到为p或p子节点,那么就可以return了,
不管另一个p或q子节点在何处,都只需要在return的路径上进行处理就ok。
class Solution { public: TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) { if (root == nullptr || root == p || root == q) return root; TreeNode *l = lowestCommonAncestor(root->left, p, q); TreeNode *r = lowestCommonAncestor(root->right, p, q); if (l != nullptr && r != nullptr) return root; return l != nullptr ? l : r; } };
官方题解:
class Solution { public: TreeNode *lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) { if (root == nullptr) return root; if (root->val > p->val && root->val > q->val) return lowestCommonAncestor(root->left, p, q); if (root->val < p->val && root->val < q->val) return lowestCommonAncestor(root->right, p, q); return root; } };

浙公网安备 33010602011771号