数据结构上机实践第九周项目1

来源:互联网 发布:轩辕剑昆仑镜进阶数据 编辑:程序博客网 时间:2024/05/22 18:02


二叉树算法库

学了新的内容就应该有新的应用,本次实践将进行二叉树算法库的建立,来适应更多工程的需求,丰富算法库。
注:在main函数中,创建的用于测试的二叉树如下
这里写图片描述
首先本次建立算法库实践将会运用到多文件组织工程的建立的做法,此处不再罗列,点击此处可参考;
建立好的工程文件视角如下:

实现源代码如下:

1.btree.h
[cpp] view plain copy
  1. //*Copyright  (c)2017,烟台大学计算机与控制工程学院*                 
  2. //*All rights reservrd.*                 
  3. //*文件名称 :btree.h*                 
  4. //*作者:侯成健*              
  5. //*完成时间:2017年11月16日*                  
  6. //*版本号:v1.0*              
  7. //*问题描述:包含定义二叉树表示数据结构的代码、宏定义、要实现算法的函数的声明*                 
  8. //*输入描述:无*                 
  9. //*程序输出:无*   
  10. #ifndef BTREE_H_INCLUDED  
  11. #define BTREE_H_INCLUDED  
  12.   
  13. #define MaxSize 100  
  14. typedef char ElemType;  
  15. typedef struct node  
  16. {  
  17.     ElemType data;              //数据元素  
  18.     struct node *lchild;        //指向左孩子  
  19.     struct node *rchild;        //指向右孩子  
  20. } BTNode;  
  21. void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链  
  22. BTNode *FindNode(BTNode *b,ElemType x);     //返回data域为x的节点指针  
  23. BTNode *LchildNode(BTNode *p);  //返回*p节点的左孩子节点指针  
  24. BTNode *RchildNode(BTNode *p);  //返回*p节点的右孩子节点指针  
  25. int BTNodeDepth(BTNode *b); //求二叉树b的深度  
  26. void DispBTNode(BTNode *b); //以括号表示法输出二叉树  
  27. void DestroyBTNode(BTNode *&b);  //销毁二叉树  
  28.   
  29. #endif // BTREE_H_INCLUDED  


2.btree.cpp
[cpp] view plain copy
  1. //*Copyright  (c)2017,烟台大学计算机与控制工程学院*                 
  2. //*All rights reservrd.*                 
  3. //*文件名称 :btree.cpp*                 
  4. //*作者:侯成健*              
  5. //*完成时间:2017年11月16日*                  
  6. //*版本号:v1.0*              
  7. //*问题描述:包含实现各种算法的函数的定义*                 
  8. //*输入描述:无*                 
  9. //*程序输出:无*    
  10. #include <stdio.h>  
  11. #include <malloc.h>  
  12. #include "btree.h"  
  13.   
  14. void CreateBTNode(BTNode *&b,char *str)     //由str串创建二叉链  
  15. {  
  16.     BTNode *St[MaxSize],*p=NULL;  
  17.     int top=-1,k,j=0;  
  18.     char ch;  
  19.     b=NULL;             //建立的二叉树初始时为空  
  20.     ch=str[j];  
  21.     while (ch!='\0')    //str未扫描完时循环  
  22.     {  
  23.         switch(ch)  
  24.         {  
  25.         case '(':  
  26.             top++;  
  27.             St[top]=p;  
  28.             k=1;  
  29.             break;      //为左节点  
  30.         case ')':  
  31.             top--;  
  32.             break;  
  33.         case ',':  
  34.             k=2;  
  35.             break;                          //为右节点  
  36.         default:  
  37.             p=(BTNode *)malloc(sizeof(BTNode));  
  38.             p->data=ch;  
  39.             p->lchild=p->rchild=NULL;  
  40.             if (b==NULL)                    //p指向二叉树的根节点  
  41.                 b=p;  
  42.             else                            //已建立二叉树根节点  
  43.             {  
  44.                 switch(k)  
  45.                 {  
  46.                 case 1:  
  47.                     St[top]->lchild=p;  
  48.                     break;  
  49.                 case 2:  
  50.                     St[top]->rchild=p;  
  51.                     break;  
  52.                 }  
  53.             }  
  54.         }  
  55.         j++;  
  56.         ch=str[j];  
  57.     }  
  58. }  
  59. BTNode *FindNode(BTNode *b,ElemType x)  //返回data域为x的节点指针  
  60. {  
  61.     BTNode *p;  
  62.     if (b==NULL)  
  63.         return NULL;  
  64.     else if (b->data==x)  
  65.         return b;  
  66.     else  
  67.     {  
  68.         p=FindNode(b->lchild,x);  
  69.         if (p!=NULL)  
  70.             return p;  
  71.         else  
  72.             return FindNode(b->rchild,x);  
  73.     }  
  74. }  
  75. BTNode *LchildNode(BTNode *p)   //返回*p节点的左孩子节点指针  
  76. {  
  77.     return p->lchild;  
  78. }  
  79. BTNode *RchildNode(BTNode *p)   //返回*p节点的右孩子节点指针  
  80. {  
  81.     return p->rchild;  
  82. }  
  83. int BTNodeDepth(BTNode *b)  //求二叉树b的深度  
  84. {  
  85.     int lchilddep,rchilddep;  
  86.     if (b==NULL)  
  87.         return(0);                          //空树的高度为0  
  88.     else  
  89.     {  
  90.         lchilddep=BTNodeDepth(b->lchild);   //求左子树的高度为lchilddep  
  91.         rchilddep=BTNodeDepth(b->rchild);   //求右子树的高度为rchilddep  
  92.         return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);  
  93.     }  
  94. }  
  95. void DispBTNode(BTNode *b)  //以括号表示法输出二叉树  
  96. {  
  97.     if (b!=NULL)  
  98.     {  
  99.         printf("%c",b->data);  
  100.         if (b->lchild!=NULL || b->rchild!=NULL)  
  101.         {  
  102.             printf("(");  
  103.             DispBTNode(b->lchild);  
  104.             if (b->rchild!=NULL) printf(",");  
  105.             DispBTNode(b->rchild);  
  106.             printf(")");  
  107.         }  
  108.     }  
  109. }  
  110. void DestroyBTNode(BTNode *&b)   //销毁二叉树  
  111. {  
  112.     if (b!=NULL)  
  113.     {  
  114.         DestroyBTNode(b->lchild);  
  115.         DestroyBTNode(b->rchild);  
  116.         free(b);  
  117.     }  
  118. }  


3.main.cpp
[cpp] view plain copy
  1. //*Copyright  (c)2017,烟台大学计算机与控制工程学院*                 
  2. //*All rights reservrd.*                 
  3. //*文件名称 :main.cpp*                 
  4. //*作者:侯成健*              
  5. //*完成时间:2017年11月16日*                  
  6. //*版本号:v1.0*              
  7. //*问题描述:测试函数*                 
  8. //*输入描述:无*                 
  9. //*程序输出:无*   
  10. #include <stdio.h>  
  11. #include "btree.h"  
  12.   
  13. int main()  
  14. {  
  15.     BTNode *b,*p,*lp,*rp;;  
  16.     printf("  (1)创建二叉树:");  
  17.     CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//创建二叉树  
  18.     printf("\n");  
  19.     printf("  (2)输出二叉树:");  
  20.     DispBTNode(b);  
  21.     printf("\n");  
  22.     printf("  (3)查找H节点:");  
  23.     p=FindNode(b,'H');  
  24.     if (p!=NULL)  
  25.     {  
  26.         lp=LchildNode(p);  
  27.         if (lp!=NULL)  
  28.             printf("左孩子为%c ",lp->data);  
  29.         else  
  30.             printf("无左孩子 ");  
  31.         rp=RchildNode(p);  
  32.         if (rp!=NULL)  
  33.             printf("右孩子为%c",rp->data);  
  34.         else  
  35.             printf("无右孩子 ");  
  36.     }  
  37.     else  
  38.         printf(" 未找到!");  
  39.     printf("\n");  
  40.     printf("  (4)二叉树b的深度:%d\n",BTNodeDepth(b));  
  41.     printf("  (5)释放二叉树b\n");  
  42.     DestroyBTNode(b);  
  43.     return 0;  
  44. }  


测试运行结果截图如下:


原创粉丝点击