第十一周项目1-验证二叉树算法(1)

来源:互联网 发布:佳能wifi软件app 编辑:程序博客网 时间:2024/05/22 11:03

问题及代码:

/*copyright (t) 2016,烟台大学计算机学院*All rights reserved.*文件名称:1.cpp*作者:常锐*完成日期:2016年11月7日*版本号:v1.0*问题描述:实现二叉树的层次遍历算法,并使用不同测试数据创建二叉树,进行测试。请利用二叉树算法库。*输入描述:二叉树字符串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"#define maxlen 1000char str[maxlen];                         //定义存放二叉树字符串的数组void LevelOrder(BTNode *b){    BTNode *p;    BTNode *qu[MaxSize];                  //定义环形队列,存放节点指针    int front,rear;                       //定义队头和队尾指针    front=rear=-1;                        //置队列为空队列    rear++;    qu[rear]=b;                           //根节点指针进入队列    while (front!=rear)                   //队列不为空    {        front=(front+1)%MaxSize;        p=qu[front];                      //队头出队列        printf("%c ",p->data);            //访问节点        if (p->lchild!=NULL)              //有左孩子时将其进队        {            rear=(rear+1)%MaxSize;            qu[rear]=p->lchild;        }        if (p->rchild!=NULL)              //有右孩子时将其进队        {            rear=(rear+1)%MaxSize;            qu[rear]=p->rchild;        }    }    printf("\n");}int main(){    BTNode *b;    while(gets(str))    {        CreateBTNode(b,str);        printf("二叉树b: ");        DispBTNode(b);        printf("\n");        printf("层次遍历序列:\n");        LevelOrder(b);        DestroyBTNode(b);        fflush(stdin);    }    return 0;}

运行结果:


知识点总结:

        二叉树的层次遍历算法

心得体会:

        综合了二叉树与顺序环形队列的知识点,完成整个层次遍历过程:

        1. 一层一层进行,先访问的节点其左右孩子也要先访问 --> “先进先出”,使用顺序环形队列

        2. 先将根节点进队,在队不空时循环;从队列中出列一个节点 *p并访问;若它有左孩子节点,将左孩子节点进队;若它有右孩子节点,将右孩子节点进队,如此操作直到队空为止。

0 0
原创粉丝点击