class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == p || root == q || root == NULL) return root;
TreeNode* left = lowestCommonAncestor(root->left, p, q); //左
TreeNode* right = lowestCommonAncestor(root->right, p, q); //右
if (left != NULL && right != NULL) { //中
return root;
} else if (left != NULL && right == NULL) {
return left;
} else if (left == NULL && right != NULL) {
return right;
} else {
return NULL;
}
}
};
思路:首先得知道如何去判断p和q的公共祖先,就是该结点如果左子树和右子树各有一个p或q,则这个结点就是公共祖先,还有一种情况是p或者q就是公共祖先。然后这题得用后序遍历,这样才容易找到其祖先,因为要从下往上找嘛,而且正是因为从下往上找,找到第一个返回值就是答案。当只有一边的子树为空是,就说明p,q都在同一边的子树中,所以直接返回即可,返回的是p或q中深度小的。
这题要遍历整个树但是还要返回值的原因就是这题是后序遍历,就是回溯,回溯需要对返回值进行处理。
那如果是BST呢
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root->val > p->val && root->val > q->val) { //左
TreeNode* left = lowestCommonAncestor(root->left, p, q);
if (left != NULL) {
return left;
}
} else if (root->val < p->val && root->val < q->val) { //右
TreeNode* right = lowestCommonAncestor(root->right, p, q);
if (right != NULL) {
return right;
}
}
return root; //中
}
};
BST的特性就是可以直接知道p或者q到底在root的左子树还是右子树,不需要像普通二叉树一样去判断是否为NULL来确定。