九周 项目1 二叉树算法库

来源:互联网 发布:ni数据采集卡使用入门 编辑:程序博客网 时间:2024/06/06 07:28
/*   烟台大学计算机学院      文件名称:hh.cpp      作者:  李金朴    完成日期:2017年10月29日      问题描述:定义二叉树的链式存储结构,实现其基本运算,并完成测试     输入描述:无     输出描述:输出二叉树,查找后结果,左右孩子     */                 //btree.h:                #include <stdio.h>        typedef 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 <stdio.h>    #include <malloc.h>    #include "btree.h"    #define MaxSize 100        void CreateBTNode(BTNode *&b,char *str)    {        BTNode *St[MaxSize],*p;            int top=-1,k,j=0;            char ch;            b=NULL;  //建立的二叉树初始时为空                ch=str[j];            while(ch!='\0') //扫描字符串        {            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)                    {                        b=p;                    }                    else                        {                            switch(k)                            {                                case 1:                                St[top]->lchild=p;                                break;                                case 2:                                    St[top]->rchild=p;                                    break;                            }                        }             }             j++;             ch=str[j];            }    }        void DestroyBTNode(BTNode *&b)    {        if(b!=NULL)        {            DestroyBTNode(b->lchild);//销毁左子树            DestroyBTNode(b->rchild);//销毁右子树            free(b);//销毁根结点            }    }        BTNode *FindNode(BTNode *b,ElemType 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)//求左子树    {        return p->lchild;    }    BTNode *RchildNode(BTNode *p)//求右子树    {        return p->rchild;    }        int BTNodeDepth(BTNode *b)    {        int lchildh;            int rchildh;            if(b==NULL)            return 0;//空树        else        {            lchildh=BTNodeDepth(b->lchild);//递归求根结点左子树            rchildh=BTNodeDepth(b->rchild);//递归求根结点右子树            {                if(lchildh>rchildh)                {                    return lchildh+1;                }                else                    {                        return rchildh+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(")");                }        }    }            //main:            #include <stdio.h>    #include "btree.h"        int main()    {        BTNode *p,*lp,*rp;        BTNode *p1;        CreateBTNode(p,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");//二叉树建立        DispBTNode(p);        if(FindNode(p,'H')!=NULL)            {            p1=FindNode(p,'H');          if (p1!=NULL)        {            lp=LchildNode(p1);            if (lp!=NULL)                printf("\n左孩子为%c\n",lp->data);            else                printf("\n无左孩子\n");            rp=RchildNode(p1);            if (rp!=NULL)                printf("右孩子为%c\n",rp->data);            else                printf("无右孩子\n");        }        else            printf(" 未找到\n");                }        printf("%d\n",BTNodeDepth(p));        printf("销毁树");            DestroyBTNode(p);            return 0;    } 

运行结果:


原创粉丝点击