第九周项目1

来源:互联网 发布:蓝德资本网络非法传销 编辑:程序博客网 时间:2024/05/22 03:49
/* 烟台大学计算机学院  文件名称:xiangmu.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 100void 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;}


运行结果:

学习心得:

学会了如何利用二叉树链式算法实现基本运算。

原创粉丝点击