二叉树的最近公共祖先(C++实现)
算法思路
我们遍历整颗二叉树,定义F(x)表示x节点的子树或本身是否包含p节点或q节点,如果包含即为true。那么符合条件的最近公共祖先x一定满足如下条件:
F(x->lchild)&&F(x->rchild) || ((x=p||x=q)&&F(x->lchild)||F(x->rchild))
意为:左子树包含q且右子树包含p 或者 x为p(或q)且q(或p)是他的子树
C++代码
class Solution { public: TreeNode* ans=NULL; bool dfs(TreeNode* root, TreeNode* p, TreeNode* q) { if (root == NULL)return false; bool inc = root->val == p->val || root->val == q->val; bool l = dfs(root->left, p, q); bool r = dfs(root->right, p, q); if (l && r || (inc && (l || r))) { ans = root; } return l || r || inc; } TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { dfs(root, p, q); return ans; } };