思路分析:
若一个节点ans为p、q的最近公共祖先,则需满足条件:
- (p、q分别在ans的左右子树中)或((p、q其中之一是ans)且(p、q其中之一在ans的左右子树中))
代码表示为:
- ( lson && rson ) || ( ( root == p || root == q ) && ( lson || rson ) )
其中lson表示左子树中是否含p或q;rson表示右子树中是否含p或q;
此条件为递归所需的动态判断方程,由此实现递归推导。
代码实现(c++):
class Solution {
public:
TreeNode* ans;
bool dfs(TreeNode* root, TreeNode* p, TreeNode* q)
{
if(root==nullptr) return 0;
bool lson=dfs(root->left,p,q);
bool rson=dfs(root->right,p,q);
if((lson&&rson)||((root==p||root==q)&&(lson||rson)))
ans=root;
return lson||rson||(root==p||root==q);
}
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q)
{
dfs(root,p,q);
return ans;
}
};
运行结果: