思路
深度优先搜索递归
解题过程
1. find函数:
• 递归函数,用于查找树中是否包含节点p或q,并更新最近公共祖先ans。
• 如果当前节点为空或已经找到最近公共祖先,返回false。
• 递归查找左子树和右子树。
• 检查当前节点是否是p或q。
• 如果当前节点是p或q,或者左子树和右子树中包含p或q中的两个,则当前节点是最近公共祖先。
• 返回当前节点、左子树或右子树中是否包含p或q。
2. lowestCommonAncestor函数:
• 主函数,用于查找二叉树中节点p和q的最近公共祖先。
• 初始化最近公共祖先为nullptr。
• 调用递归函数查找最近公共祖先。
• 返回最近公共祖先。
复杂度
- 时间复杂度: O(N)
- 空间复杂度: O(H)
Code
class Solution {
public:
// 递归函数,查找树中是否包含节点 p 或 q,并更新最近公共祖先 ans
bool find(TreeNode* root, TreeNode* p, TreeNode* q, TreeNode*& ans) {
if (!root || ans) return false; // 如果当前节点为空或已经找到最近公共祖先,返回 false
// 递归查找左子树和右子树
bool left = find(root->left, p, q, ans);
bool right = find(root->right, p, q, ans);
// 检查当前节点是否是 p 或 q
bool mid = (root == p || root == q);
// 如果当前节点是 p 或 q,或者左子树和右子树中包含 p 或 q 中的两个,则当前节点是最近公共祖先
if (mid + left + right >= 2) {
ans = root;
}
// 返回当前节点、左子树或右子树中是否包含 p 或 q
return mid || left || right;
}
// 主函数,查找二叉树中节点 p 和 q 的最近公共祖先
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
TreeNode* ans = nullptr; // 初始化最近公共祖先为 nullptr
find(root, p, q, ans); // 调用递归函数查找最近公共祖先
return ans; // 返回最近公共祖先
}
};
我在LeetCode上也发了该题的题解,还有其他题目的题解,需要的话可以进以下链接。
链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/solutions/3599784/dfsshen-du-you-xian-sou-suo-di-gui-by-no-jq9m/