ZBLOG

#include #include #define TRUE 1 #define FALSE 0 #define Stack_Size 20 typedef struct Node { char data; struct Node *LChild; struct Node *RChild; }BiTNode,*BiTree; typedef struct { BiTree elem[Stack_Size]; int top; }Se...

#include #include

#define TRUE 1 #define FALSE 0

#define Stack_Size 20 typedef struct Node {

char data;
struct Node *LChild;
struct Node *RChild;

}BiTNode,*BiTree;

typedef struct {

BiTree elem[Stack_Size];
int top;

}SeqStack;

SeqStack S1,S2; BiTree p,bt;

int Select_menu(); void CreateTree(BiTree *bt); void PreOrdere(BiTree bt); void path(BiTree bt, char ch, SeqStack *S); BiTree FindParents(BiTree bt,char p,char q,SeqStack S1,SeqStack S2);

int Select_menu() {

int a;
printf("求二叉树中p与q结点的最近共同祖先管理程序\n");
printf("-------------------------------------------\n");
printf("1.利用扩展的先序序列建立二叉树\n");
printf("2.输出已建立的二叉树:\n");
printf("3.你想求哪两个结点的最近共同祖先,请输入p和q\n");
printf("4.找出p与q结点最近的共同祖先\n");
printf("0.退出该管理系统\n");
printf("===============================\n");
printf("请输入0--4:\n");
for(;;)
{
    scanf("%d",&a);
    if(a>4||a<0)
    {
        printf("输入错误,请重新输入:\n");
    }
    else
        break;
}
return a;

}

void CreateTree(BiTree *bt)//先序建立二叉树 {

char ch;
scanf(" %c",&ch);
if(ch=='.') 
    *bt=NULL;
else
{
    *bt=(BiTree)malloc(sizeof(BiTNode));
    (*bt)->data=ch;
    CreateTree(&((*bt)->LChild));
    CreateTree(&((*bt)->RChild));
}

}

void PreOrdere(BiTree bt)//先序输出二叉树 {

if(bt!=NULL)
{
    printf("%3c",bt->data);
    PreOrdere(bt->LChild);
    PreOrdere(bt->RChild);
}

}

void path(BiTree bt, char ch, SeqStack *S) {

BiTNode *p, *q;
S->top = -1;
q = NULL, p = bt;
while (p != NULL|| S->top !=-1)
{
    while (p != NULL)
    {
        S->top++;
        if (S->top >= Stack_Size)
        {
            return;
        }
        S->elem[S->top] = p;
        p = p->LChild;
    }
    if (S->top > -1)
    {
        p = S->elem[S->top];
        if (p->RChild == NULL || p->RChild == q)
        {
            if (p->data == ch)
            {
                return;
            }   
            else
            {
                q = p;
                S->elem[S->top] = NULL;
                S->top--;
                p = NULL;
            }
        }
        else
            p = p->RChild;
    }
}       

}

/* TODO:找出共同祖先 功能描述:找出p和q节点的最近共同祖先 例如:树结构为 A

         B   C
  则BC的最近共同先祖为A

参数:BiTree类型指针bt,char型参数p、q, SeqStack型栈S1 、S2 返回值说明:返回其共同祖先 */ BiTree FindParents(BiTree bt,char p,char q,SeqStack S1,SeqStack S2) {

BiTree t,p1,p2;
path(bt,p,&S1);//路径1 
path(bt,q,&S2);//路径2

if(S1.top==-1||S2.top==-1)//没有找到路径 
    return NULL;

while(S1.elem[S1.top]==S2.elem[S2.top]&&S1.top!=0&&S2.top!=0)//路径公共部分 
{
    S1.top--;
    S2.top--;
}
if(S1.top==0) //若p是q的祖先,或q是p的祖先 
    return S1.elem[0]; 
else 
    return S2.elem[0];

}

int main(void) {

char p,q;
BiTree s;
bt=(BiTree)malloc(sizeof(BiTNode));
for(;;)
{
    switch(Select_menu())
    {
        case 1:
            printf("请输入你要建立的二叉树的元素(‘.’表示空):\n");
            CreateTree(&bt);
            break;
        case 2:
            printf("您刚刚建立的二叉树为:\n");
            PreOrdere(bt);
            printf("\n");
            break;
        case 3:
            printf("请输入你要查找的两个节点:\n");
            getchar();
            scanf("%c%c",&p,&q);
            getchar();
            break;
        case 4:
            s=FindParents(bt,p,q,S1,S2);
            printf("你想找的共同祖先为:%c\n",s->data);
            break;
        case 0:
            printf("再见啦!\n");
            return 0;
    }
 }

}

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=1119

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?