解题思路
1、如果一个结点,它的左子树出现结点p,右子树出现结点q,或者左子树出现结点q,右子树出现结点p,则该结点就是p和q的最近公共祖先。
2、还有一种特殊情况,结点本身p(q),自己就是最近公共祖先。(那就遇到p直接返回就好)
class Solution {
public:
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
//如果找到结点p或者q,或者遇到空结点就返回
if(root == p || root == q || !root)return root;
//适合用后序遍历:先处理叶子结点,再处理中间结点,即先找到p、q,再找到父结点
TreeNode* left = lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
//left、right不为空就是遇到了p和q点
if(left && right)return root;//找到了两个点,那就能得到父结点
if(left && !right)return left;//找到其中一点
else if(!left && right)return right;
else return NULL;
}
};