236. 二叉树的最近公共祖先
题目链接:36. 二叉树的最近公共祖先
方法:回溯
解题思路
若两个节点 \(p\),\(q\) 分别出现在节点 \(x\) 的左右子树中,那么该节点就是 \(LCA(p, q)\),并且只可能出现在节点 \(x\) 的左右子树中 。
代码
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (!root) return NULL;
if (root == p || root == q) return root; // 找到其中一个,并返回
TreeNode* l = lowestCommonAncestor(root->left, p, q); // 左子树有没有
TreeNode* r = lowestCommonAncestor(root->right, p, q); // 右子树有没有
if (!l && !r) return NULL; // 都没有则返回NULL
else if (!l) return r; // 若只找到一个,则返回
else if (!r) return l;
return root; // 若都找到,表明当前节点就为 x ,且继续向上回溯,由于其他子树都返回NULL,该节点会一直返回到最上层
}
};
复杂度分析
时间复杂度:\(O(n)\);
空间复杂度:\(O(1)\),忽略递归调用栈。

浙公网安备 33010602011771号