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

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

/**********
【题目】试编写算法,求二叉树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;
}
    原文作者:B树
    原文地址: https://blog.csdn.net/Stranger_CJHan/article/details/50150927
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞