第十周项目1-二叉树算法库

来源:互联网 发布:ovid数据库检索途径 编辑:程序博客网 时间:2024/06/03 17:15

问题及代码:

/*copyright (t) 2016,烟台大学计算机学院*All rights reserved.*文件名称:1.cpp*作者:常锐*完成日期:2016年11月3日*版本号:v1.0*问题描述:定义二叉树的链式存储结构,实现其基本运算,并完成测试。 要求:   1、头文件btree.h中定义数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括:    void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链    BTNode *FindNode(BTNode *b,ElemType x);         //返回data域为x的节点指针    BTNode *LchildNode(BTNode *p);                  //返回*p节点的左孩子节点指针    BTNode *RchildNode(BTNode *p);                  //返回*p节点的右孩子节点指针    int BTNodeDepth(BTNode *b);                     //求二叉树b的深度    void DispBTNode(BTNode *b);                     //以括号表示法输出二叉树    void DestroyBTNode(BTNode *&b);                 //销毁二叉树  2、在btree.cpp中实现这些函数   3、在main函数中完成测试,包括如下内容:   (1)用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建如图的二叉树用于测试。   (2)输出二叉树  (3)查找值为’H’的节点,若找到,输出值为’H’的节点的左、右孩子的值   (4)求高度二叉树高度   (5)销毁二叉树*输入描述:二叉树str串*程序输出:基本运算测试结果*/

btree.h:

#include <stdio.h>#include <malloc.h>#define MaxSize 100typedef char ElemType;typedef struct node                             //二叉链存储结构{    ElemType data;                              //数据元素    struct node *lchild;                        //指向左孩子节点    struct node *rchild;                        //指向右孩子节点} BTNode;void CreateBTNode(BTNode *&b,char *str);        //由str串创建二叉链BTNode *FindNode(BTNode *b,ElemType x);         //返回data域为x的节点指针BTNode *LchildNode(BTNode *p);                  //返回*p节点的左孩子节点指针BTNode *RchildNode(BTNode *p);                  //返回*p节点的右孩子节点指针int BTNodeDepth(BTNode *b);                     //求二叉树b的深度void DispBTNode(BTNode *b);                     //以括号表示法输出二叉树void DestroyBTNode(BTNode *&b);                 //销毁二叉树

btree.cpp:

#include "btree.h"void CreateBTNode(BTNode *&b,char *str)        //由str串创建二叉链{    BTNode *St[MaxSize],*p=NULL;    int top=-1,k,j=0;    char ch;    b=NULL;                                    //建立的二叉树初始时为空    ch=str[j];    while (ch!='\0')                           //str未扫描完时循环    {        switch(ch)        {        case '(':            top++;            St[top]=p;            k=1;            break;                             //为左节点        case ')':            top--;            break;        case ',':            k=2;            break;                             //为右节点        default:            p=(BTNode *)malloc(sizeof(BTNode));            p->data=ch;            p->lchild=p->rchild=NULL;            if (b==NULL)                       //p指向二叉树的根节点                b=p;            else                               //已建立二叉树根节点            {                switch(k)                {                case 1:                    St[top]->lchild=p;                    break;                case 2:                    St[top]->rchild=p;                    break;                }            }        }        j++;        ch=str[j];    }}BTNode *FindNode(BTNode *b,ElemType x)         //返回data域为x的节点指针{    BTNode *p;    if (b==NULL)        return NULL;    else if (b->data==x)        return b;    else    {        p=FindNode(b->lchild,x);        if (p!=NULL)            return p;        else            return FindNode(b->rchild,x);    }}BTNode *LchildNode(BTNode *p)                  //返回*p节点的左孩子节点指针{    return p->lchild;}BTNode *RchildNode(BTNode *p)                  //返回*p节点的右孩子节点指针{    return p->rchild;}int BTNodeDepth(BTNode *b)                     //求二叉树b的深度{    int lchilddep,rchilddep;    if (b==NULL)        return(0);                             //空树的高度为0    else    {        lchilddep=BTNodeDepth(b->lchild);      //求左子树的高度为lchilddep        rchilddep=BTNodeDepth(b->rchild);      //求右子树的高度为rchilddep        return (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);    }}void DispBTNode(BTNode *b)                     //以括号表示法输出二叉树{    if (b!=NULL)    {        printf("%c",b->data);        if (b->lchild!=NULL || b->rchild!=NULL)        {            printf("(");            DispBTNode(b->lchild);            if (b->rchild!=NULL) printf(",");            DispBTNode(b->rchild);            printf(")");        }    }}void DestroyBTNode(BTNode *&b)                 //销毁二叉树{    if (b!=NULL)    {        DestroyBTNode(b->lchild);        DestroyBTNode(b->rchild);        free(b);    }}

main.cpp:

#include <stdio.h>#include "btree.h"int main(){    BTNode *b,*p,*lp,*rp;    char str[MaxSize];                         //创建二叉树的str串    char x;    while(gets(str)!=NULL)    {        CreateBTNode(b,str);                   //创建二叉树        printf("二叉树创建成功:\n");        DispBTNode(b);        printf("\n");        printf("请输入查找节点:\n");          //查找节点        scanf("%c",&x);        p=FindNode(b,x);        if (p!=NULL)        {            lp=LchildNode(p);            if (lp!=NULL)                printf("左孩子为%c ",lp->data);            else                printf("无左孩子 ");            rp=RchildNode(p);            if (rp!=NULL)                printf("右孩子为%c",rp->data);            else                printf("无右孩子 ");        }        else            printf("未找到!");        printf("\n");        printf("二叉树b的深度为:%d\n\n",BTNodeDepth(b));     //求二叉树深度        DestroyBTNode(b);                                     //释放二叉树        printf("二叉树释放成功!\n");                fflush(stdin);                          //清空缓冲区,避免之前读入的字符串的影响    }    return 0;}

运行结果:


知识点总结:

        二叉树的链式存储结构及基本运算

心得体会:

        1. 输入样例中建好的二叉树结构如下:

        

        2. 通过建立二叉树算法库,测试基本运算,加深了对其结构及实现过程的理解。此部分内容难度较大,有必要跟着算法”走一走“,手工模拟机器单步调试过程;另外使用多组输入输入字符串时,要注意缓冲区的清理,避免之前的输入对接下来的操作产生影响。

0 0