题目描述:设一棵二叉树的结点结构为(LLINK,INFO,RLINK),ROOT 为指向该二叉树根结点的指针,p和q分别为指向该二叉树中任意两个结点的指针,试编写算法ANCESTOR (ROOT,p,q),找到 p和q的最近公共祖先结点 r。
分析: 考虑使用递归,找祖先,所以使用后序递归遍历;最近公共祖先是说离 p和q最近的祖先,p和q本身就可以时最近公共祖先。
1、如果p和q本身就是公共祖先,则直接返回
2、去左右子树递归
3、若其左右递归返回值都不为空,则 ROOT 是最近公共祖先
否则若左递归返回值不为空,则其返回值则为最近公共祖先
否则若右递归返回值不为空,则其返回值则为最近公共祖先
BiTNode ANCESTOR(ROOT,p,q){
if(ROOT == NULL || ROOT == p || ROOT == q)
return ROOT;
BiTNode *left = ANCESTOR(ROOT->LLINK,p,q);
BiTNode *right = ANCESTOR(ROOT->RLINK,p,q);
if(left && right)
return ROOT;
else if(left)
return left;
else if(right)
return right;
return NULL;
}