解法:递归
思想:
●终止条件:
1.root为NULL,返回NULL
2.p或q为root,直接返回root
●递推:
1.对左子进行递归,返回值记为left
2.对右子进行递归,返回值记为right
●返回值:根据left和right为空和不为空,展开为四种情况
1.同时为空,说明左右子树都不包含p和q,返回NULL
2.同时不为空,说明一个在左,一个在右,返回root
3.left为空,right不为空,说明p,q都不在left中,返回right
4.right为空,left不为空,说明p,q都不在right中,返回left
复杂度:
●时间:O(N),最差情况下需要递归遍历树的所有节点
●空间:O(N),最差情况下,递归深度达到N
注意:
递归时一定要明确函数的功能
该函数的功能有3个:
-
如果p,q都存在root的树中,返回公共祖先
-
如果p,q存在一个,返回p,q
-
如果都不存在,返回NULL
代码:
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL)
return NULL;
if(root == p || root == q)
return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q);
TreeNode* right = lowestCommonAncestor(root->right, p, q);
/* 可省略
if(left == null && right == null)
return null;
*/
// 如果左边没有p和q中的一个或多个,说明都在右边
if(left == NULL)
return right;
// 同理
if(right == NULL)
return left;
// 都不为空,说明左右各一个,返回root
return root;
}
};