1.题目要求
2.算法思想
需要自底向上找,后序遍历方便。
找结点p和结点q的最近公共祖先,有两种情况。
(1)p和q拥有最近公共祖先r。
(2)结点p(q)本身拥有子孙结点q§。
需要遍历整棵树。然后递归访问左右子树。
- 如果左子树和右子树均不为空,直接返回root。
- 左子树为空,右子树不为空,返回右子树。
- 左子树不为空,右子树为空,返回左子树。
- 左子树为空,右子树为空,人会空。
3.实现代码
/**
* 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==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 right;
else if(left!=NULL&&right==NULL) return left;
return NULL;
}
};