也不知道方法好不好 先贴在这
/**********
【题目】试编写算法,求二叉树T中结点a和b的最近共同祖先。
二叉链表类型定义:
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild,*rchild;
} BiTNode, *BiTree;
可用栈类型Stack的相关定义:
typedef struct {
BiTNode *ptr; // 二叉树结点的指针类型
int tag; // 0..1
} SElemType; // 栈的元素类型
Status InitStack(Stack &S);
Status StackEmpty(Stack S);
int StackLength(SqStack S);
Status Push(Stack &S, SElemType e);
Status Pop(Stack &S, SElemType &e);
Status GetTop(Stack S, SElemType &e);
**********/
Status getPathStack(Stack &s,BiTree t,TElemType v)
{
if(t == NULL) return ERROR;
SElemType e;
e.ptr = t;
if (t->data == v) {
Push(s,e);
return OK;
}
if (OK == getPathStack(s,t->lchild,v)) {
Push(s,e);
return OK;
}
if (OK == getPathStack(s,t->rchild,v)) {
Push(s,e);
return OK;
}
Pop(s,e);
return ERROR;
}
BiTree CommAncestor(BiTree T, TElemType a, TElemType b)
/* 求二叉树T中结点a和b的最近共同祖先 */
{
if (T == NULL) return NULL;
Stack sa,sb;
InitStack(sa);
InitStack(sb);
if (ERROR == getPathStack(sa,T,a)) return NULL;
if (ERROR == getPathStack(sb,T,b)) return NULL;
SElemType E1,E2,e1,e2;
Pop(sa,E1);
Pop(sb,E2);
while (!StackEmpty(sa) && !StackEmpty(sb)) {
e1 = E1;
e2 = E2;
if (ERROR == Pop(sa,E1) || ERROR == Pop(sb,E2) || E1.ptr->data != E2.ptr->data || E1.ptr->data == a || E2.ptr->data == b)
return e1.ptr;
}
return NULL;
}