day21
思路:
通过回溯,将结果一层层向上返回。
这里 p,q是不同的。
一个根结点,左右都有。q,p。说明root就是需要的结点。
左边有,右边没有。说明结果是从左边传上来的。
右边有,左边没有。说明结果是从右边传上来的。
注意:
1.需要用后序遍历,因为需要根据 左子树 和 右子树,来处理中间逻辑。
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(root == NULL)
return NULL;
if(root == q || root == p)
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;
}
};