236.二叉树的最近公共祖先
在树结构中,祖先指的是一个节点的父节点或更高层级的父节点。公共祖先是指同时为节点p和q的祖先的节点。最近公共祖先(LCA)则是指在所有公共祖先中,距离p和q最近的那个节点。寻找LCA的方法可以按以下情况进行分析:
- 当前节点为空节点
- 当前节点就是p节点
- 当前节点就是q节点
- 当前节点既不是p也不是q,且p和q位于其子树中:
- p和q分别位于左右子树
- p和q都在左子树
- p和q都在右子树
- p和q都不在子树中
具体解决方案如下:
情况1:空节点不可能是p和q的LCA。
情况2和3:如果当前节点是p或q,直接返回当前节点。因为若当前节点是p,而q是其子节点,则p就是LCA(节点可以是自身的LCA)。若q不在p的子树中,则无需继续在p的子树中搜索。
情况4.1:当前节点就是LCA。因为如果LCA在左子树,则不会是q的祖先;在右子树则不会是p的祖先;在上层节点则不满足"最近"的条件。
情况4.2:LCA必定在左子树中,因此递归搜索左子树。
情况4.3和4.4可以合并处理:若p和q都在右子树,则递归搜索右子树;若都不在子树中,则右子树也为空。
class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root || root == p || root == q) {return root;}TreeNode *left = lowestCommonAncestor(root->left,p,q);TreeNode *right = lowestCommonAncestor(root->right,p,q);if (left && right) {return root;}if (left) {return left;}return right;}
};
时间复杂度:O(n),n为节点个数
空间复杂度:O(n)
类似的可以求解一下235. 二叉搜索树的最近公共祖先 - 力扣(LeetCode)