第十一周项目1验证算法—(1)层次遍历算法的验证

来源:互联网 发布:海康网络摄像机驱动 编辑:程序博客网 时间:2024/06/05 03:17
copyright (c) 2016,烟台大学计算机学院 
 
All rights reserved. 
 
文件名称:1.cpp 
 
作者:孟令康
 
完成日期:2016年9月12日 
 
版本号:v1.0 
 
问题描述:实现二叉树的层次遍历算法,并对用”A(B(,D(,G)),C(E,F))”创建的二叉树进行测试 

输入描述:无。

输出描述:测试结果。

代码

main.cpp:

#include<stdio.h>        #include"btree.h"        int main()        {            BTNode *b;            CreateBTNode(b,"A(B(,D(,G)),C(E,F))");            printf("二叉树b: ");            DispBTNode(b);            printf("\n");            printf("层次遍历序列:\n");            LevelOrder(b);            DestroyBTNode(b);            return 0;        }        

btree.h:

#ifndef BTREE_H_INCLUDED    #define BTREE_H_INCLUDED       #define MaxSize 100 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);  //销毁二叉树        void LevelOrder(BTNode *b);       #endif // BTREE_H_INCLUDED   
btree.cpp:

#include <stdio.h>        #include <malloc.h>        #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);            }        }        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;                }                                    }                        }        
运行结果:

知识点总结:

                     二叉树层次遍历算法的验证。

学习心得:

                     验证了二叉树的层次遍历算法,并完成了测试。


0 0
原创粉丝点击