原题链接:236. 二叉树的最近公共祖先
solution:
递归进行查找节点p和q,并且给定子树中一定存在p和q
函数表示对于当前树的查找已经完毕, 否则对左右子树进行查找, 根据左右子树的返回值判断:
1. 左右子树的返回值都不为nullptr, 由于值唯一左右子树的返回值就是p和q, 此时root为根节点
2. 如果左右子树返回值只有一个不为nullptr, 说明p和q共同存在于当前节点的左子树或右子树中
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == nullptr || root == p || root == q) return root;
TreeNode *left = lowestCommonAncestor(root->left,p,q);
TreeNode *right = lowestCommonAncestor(root->right,p,q);
if(left != nullptr && right != nullptr) return root;
else return left == nullptr ? right : left;
}
};