递归函数的功能
给定两个节点 pp 和 qq
如果 pp 和 qq 都存在,则返回它们的公共祖先;
如果只存在一个,则返回存在的一个;
如果 pp 和 qq 都不存在,则返回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)
return right;
if(right == NULL)
return left;
if(left && right) // p和q在两侧
return root;
return NULL; // 必须有返回值
}
};
时间复杂度是 O(n):每个结点最多遍历一次或用主定理
空间复杂度是 O(n):需要系统栈空间