给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。
百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)”
思路:最近公共祖先,说明p、q一定在x的左右两侧,或者p、q自己就是x。自顶向下递归,从树的叶子节点开始返回结果,如果包含了p或者q节点,就返回p或者q节点,否则返回nullptr;左右子树都不为空的那个节点就是最近公共祖先。p、q自身为公共祖先的情况:先遍历到了p或者q就直接返回
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if(!root||root==p||root==q)return root;
TreeNode* left=lowestCommonAncestor(root->left,p,q);
TreeNode* right=lowestCommonAncestor(root->right,p,q);
return !left?right:!right?left:root;
}