给出一个root节点,p节点,q节点;
1.祖先的定义:节点root的左子树中含有p节点,右子树中含有q节点,则root为p和q的祖先;
2:最近公共祖先:root的左,右子树中不含有p,q的最近公共祖先;
最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”
那么p,q的最近公共祖先root可有以下几种情况
1:p,q存在于root的子树中且位于异侧(左右子树);
2:p或q本身就为最近公共祖先;(该点容易忽略);
p为最近公共祖先时q位于p的左右子树中的一侧;
q为最近公共祖先时,同理;
最重要的一点是我们需要自顶向上的遍历顺序以便判断是否为公共祖先;即为后序遍历;
TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
if (root==p||root==q||root==NULL) return root;当遇到节点p或q时返回;当节点为空时返回
TreeNode*left=lowestCommonAncestor(root->left,p,q); 记录节点左子树是否含有目的节点
TreeNode*right=lowestCommonAncestor(root->right,p,q); 记录几点右子树是否含有目的节点
if(!left&&!right)return NULL; 节点左子树和右子树中都不含有目的节点p,q则返回NULL;
else if(!left)return right; 节点左子树为空右子树不为空,返回右子树结果
此时有两种情况 1:节点右子树的根结点为p(p为q和q的最近公共祖
先
2:节点右子树的根节点为p和q的最近公共祖先,p,q位于根节点的
两侧
else if(!right)return left;
else return root;
}