题目链接
思路分析
先对情况进行分析
- 如果一个节点在左子树,一个节点在右子树,那么就返回root节点
- 如果两个节点都在同一个子树,那么谁在上面就选谁
我们分析完情况,现在要对代码进行设计,如果找到了一个节点,那么我们就立即返回,如果没有找到,就继续向下寻找 ,可以看出是一个递归的结构
首先判断当前节点是否是我们需要节点
是 返回
不是 向下继续寻找左右子树
代码实现
/**
* 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 == 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 root;
else if(left != NULL)
return left;
else
return right;
}
};