求二叉树T中结点a和b的最近共同祖先

来源:互联网 发布:国外天气预报软件 编辑:程序博客网 时间:2024/06/06 19:54

也不知道方法好不好 先贴在这

/**********【题目】试编写算法,求二叉树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;}


0 0