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 {

  1. char data;
  2. struct Node *LChild;
  3. struct Node *RChild;

}BiTNode,*BiTree;

typedef struct {

  1. BiTree elem[Stack_Size];
  2. 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() {

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

}

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

  1. char ch;
  2. scanf(" %c",&ch);
  3. if(ch=='.')
  4. *bt=NULL;
  5. else
  6. {
  7. *bt=(BiTree)malloc(sizeof(BiTNode));
  8. (*bt)->data=ch;
  9. CreateTree(&((*bt)->LChild));
  10. CreateTree(&((*bt)->RChild));
  11. }

}

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

  1. if(bt!=NULL)
  2. {
  3. printf("%3c",bt->data);
  4. PreOrdere(bt->LChild);
  5. PreOrdere(bt->RChild);
  6. }

}

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

  1. BiTNode *p, *q;
  2. S->top = -1;
  3. q = NULL, p = bt;
  4. while (p != NULL|| S->top !=-1)
  5. {
  6. while (p != NULL)
  7. {
  8. S->top++;
  9. if (S->top >= Stack_Size)
  10. {
  11. return;
  12. }
  13. S->elem[S->top] = p;
  14. p = p->LChild;
  15. }
  16. if (S->top > -1)
  17. {
  18. p = S->elem[S->top];
  19. if (p->RChild == NULL || p->RChild == q)
  20. {
  21. if (p->data == ch)
  22. {
  23. return;
  24. }
  25. else
  26. {
  27. q = p;
  28. S->elem[S->top] = NULL;
  29. S->top--;
  30. p = NULL;
  31. }
  32. }
  33. else
  34. p = p->RChild;
  35. }
  36. }

}

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

  1. B C
  2. BC的最近共同先祖为A

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

  1. BiTree t,p1,p2;
  2. path(bt,p,&S1);//路径1
  3. path(bt,q,&S2);//路径2
  4. if(S1.top==-1||S2.top==-1)//没有找到路径
  5. return NULL;
  6. while(S1.elem[S1.top]==S2.elem[S2.top]&&S1.top!=0&&S2.top!=0)//路径公共部分
  7. {
  8. S1.top--;
  9. S2.top--;
  10. }
  11. if(S1.top==0) //若p是q的祖先,或q是p的祖先
  12. return S1.elem[0];
  13. else
  14. return S2.elem[0];

}

int main(void) {

  1. char p,q;
  2. BiTree s;
  3. bt=(BiTree)malloc(sizeof(BiTNode));
  4. for(;;)
  5. {
  6. switch(Select_menu())
  7. {
  8. case 1:
  9. printf("请输入你要建立的二叉树的元素(‘.’表示空):\n");
  10. CreateTree(&bt);
  11. break;
  12. case 2:
  13. printf("您刚刚建立的二叉树为:\n");
  14. PreOrdere(bt);
  15. printf("\n");
  16. break;
  17. case 3:
  18. printf("请输入你要查找的两个节点:\n");
  19. getchar();
  20. scanf("%c%c",&p,&q);
  21. getchar();
  22. break;
  23. case 4:
  24. s=FindParents(bt,p,q,S1,S2);
  25. printf("你想找的共同祖先为:%c\n",s->data);
  26. break;
  27. case 0:
  28. printf("再见啦!\n");
  29. return 0;
  30. }
  31. }

}

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

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

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

联系我们

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

微信号:3007537140

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

关注我们
x

注册

已经有帐号?