二叉树的实现

来源:互联网 发布:中国网民规模季度数据 编辑:程序博客网 时间:2024/06/13 22:57

主要代码;

/****************************************************  @Title: 数据结构实验  @Name: <实验6-3> 遍历二叉树及其应用  @Object:      [实验目的]          实现二叉树的二叉链表存储结构;          实现先序、中序和后序遍历二叉树;          遍历二叉树的应用:计算叶子结点,二叉树深度等       [实验提示]          1. 在 bintree.h 中实现二叉树的基本操作                    2. 在 dsp0603.cpp 中编写应用遍历二叉树的算法             @Include:      bintree.h [*]          二叉树的二叉链表实现  @Usage:      请查看"TO-DO列表",根据要求完成代码  @Copyright: BTC 2004, Zhuang Bo  @Author: Zhuang Bo  @Date: 2004  @Description:*****************************************************/#include <stdio.h>#include <stdlib.h>#define ElemType char //二叉树中数据元素类型#include "bintree.h"  //二叉树的实现//打印结点数据(作为Visit函数)Status print(char);//计算二叉树中叶子结点的个数int LeafCount(BiTree bt);//计算二叉树的深度int Deapth(BiTree bt);//按缩进方式打印二叉树void PrintTreeIndent(BiTree bt, int indent);//交换二叉树的左右子树void Change(BiTree bt);///////////////////////////////////////////////////////////// 主程序 void main(){    BiTree bt = 0;        //建立二叉树    printf("建立二叉树(按先序输入二叉树中的结点,空格表示空树)\n");     if( CreateBiTree(bt)==ERROR ) {        printf("ERROR: call CreateBiTree\n");        system("pause");        exit(1);    }printf("\n直观方式打印: \n");    PrintTree(bt);        //遍历二叉树    printf("\n先序遍历: ");    if( PreOrderTraverse(bt,print)==ERROR )        printf("ERROR: call PreOrderTraverse\n");     printf("\n中序遍历: ");    if( InOrderTraverse(bt,print)==ERROR )        printf("ERROR: call InOrderTraverse\n");     printf("\n后序遍历: ");    if( PostOrderTraverse(bt,print)==ERROR )        printf("ERROR: call PostOrderTraverse\n");     printf("\n按层遍历: ");    if( LevelOrderTraverse(bt,print)==ERROR )        printf("ERROR: call LevelOrderTraverse\n");         //二叉树的应用    printf("\n二叉树中叶子结点的个数: %d\n", LeafCount(bt));    printf("\n二叉树的深度: %d\n", Deapth(bt));    printf("\n按缩进形式打印:\n");    PrintTreeIndent(bt,1);printf("\n交换二叉树的左右子树:\n");Change(bt);PrintTree(bt);    //销毁二叉树     DestroyBiTree(bt);     system("pause"); //暂停以便查看结果 }///////////////////////////////////////////////////////////// 函数实现//打印结点数据Status print(char ch){    putchar(ch);    return OK;}//计算二叉树中叶子结点的个数int LeafCount(BiTree bt){    //-------------------------------------    // TODO (#1#):计算二叉树中叶子结点的个数int M=0,N=0;if(!bt)return 0;if((!bt->lchild)&&(!bt->rchild))return 1;M=LeafCount(bt->lchild);N=LeafCount(bt->rchild);return M+N;    //-------------------------------------}//计算二叉树的深度int Deapth(BiTree bt){    //-------------------------------------    // TODO (#1#):计算二叉树的深度int L=0,R=0;if(!bt)return 0;L=Deapth(bt->lchild);R=Deapth(bt->rchild);return 1+max(L,R);    //-------------------------------------}//按缩进方式打印二叉树void PrintTreeIndent(BiTree bt, int indent){    //-------------------------------------    // TODO (#1#):按缩进方式打印二叉树int i;if(bt){for(i=1;i<indent;i++)printf(" ");printf("%c\n",bt->data);PrintTreeIndent(bt->lchild,indent+2);PrintTreeIndent(bt->rchild,indent+2);}    //-------------------------------------}//交换二叉树的左右子树void Change(BiTree bt){//-------------------------------------// TODO (#1#):交换二叉树的左右子树BiTree T,B;T=bt;if(T){B=T->lchild;T->lchild=T->rchild;T->rchild=B;Change(T->lchild);Change(T->rchild);}//-------------------------------------}

/*  Name: 二叉链表实现二叉树   Copyright:   Author:   Date:  Description: */#ifndef BINTREE_H_INCLUDED#define BINTREE_H_INCLUDED#include <stdlib.h>#include "ds.h"//#include "sqqueue.h"  //循环队列在基本实现 //数据元素的缺省类型用char #ifndef ElemType#define ElemType char#define ELEMTYPE_TAG#endif/*下面使用TElemType如同ElemType*/#define TElemType ElemType#define QElemType BiTree     //队列元素为二叉树指针类型,所以这里不是普通的char类型  #define MAXQSIZE 100  ///////////////////////////////////////////////////////////// 二叉链表类型 typedef struct BiTNode {    TElemType data;    struct BiTNode *lchild, *rchild; //左右孩子指针 } BiTNode, *BiTree;//循环队列类型定义  typedef struct{      QElemType *base;      int front;      int rear;  }SqQueue;//初始化队列  Status InitQueue(SqQueue &Q);  //元素入队  Status EnQueue(SqQueue &Q,QElemType e);  //元素出队  Status DeQueue(SqQueue &Q,QElemType &e);  //销毁队列  Status DestroyQueue(SqQueue &Q);  //队列判空  Status QueueEmpty(SqQueue Q);    ///////////////////////////////////////////////////////////// 二叉链表的基本操作//新建二叉链表结点BiTree MakeNode(TElemType e, BiTree lch, BiTree rch){    BiTree p = (BiTree)malloc(sizeof(BiTNode));    p->data = e;    p->lchild = lch;    p->rchild = rch;    return p;}//按先序次序输入二叉树中的结点值(字符)构造二叉树 Status CreateBiTree(BiTree &T){    char ch;    read(ch); // NOTE: 这里用字符类型    if( ch==' ' ) //空格代表空指针        T = 0;    else {        //建立结点         //T = (BiTree)malloc(sizeof(BiTNode));        //T->data = ch;         //-------------------------------------        // TODO (#1#):建立左子树和右子T=MakeNode(ch, NULL, NULL);        CreateBiTree(T->lchild);        CreateBiTree(T->rchild);        //-------------------------------------    }    return OK;}//销毁二叉树Status DestroyBiTree(BiTree &T){    //-------------------------------------    // TODO (#1#): 销毁二叉树,释放所有结点     return ERROR;    //-------------------------------------} //先序遍历二叉树T,对每个结点数据调用Visit函数Status PreOrderTraverse(BiTree T, Status(*Visit)(TElemType)){    //-------------------------------------    // TODO (#1#): 先序遍历二叉树if(T){Visit(T->data);PreOrderTraverse(T->lchild,Visit);PreOrderTraverse(T->rchild,Visit);return OK;}    return ERROR;    //-------------------------------------}//中序遍历二叉树T,对每个结点数据调用Visit函数Status InOrderTraverse(BiTree T, Status(*Visit)(TElemType)){    //-------------------------------------    // TODO (#1#): 中序遍历二叉树    if(T){InOrderTraverse(T->lchild,Visit);Visit(T->data);InOrderTraverse(T->rchild,Visit);return OK;}    return ERROR;    //-------------------------------------}//后序遍历二叉树T,对每个结点数据调用Visit函数Status PostOrderTraverse(BiTree T, Status(*Visit)(TElemType)){    //-------------------------------------    // TODO (#1#): 后序遍历二叉树    if(T){PostOrderTraverse(T->lchild,Visit);PostOrderTraverse(T->rchild,Visit);Visit(T->data);return OK;}    return ERROR;    //-------------------------------------}//按层次顺序遍历二叉树T,对每个结点数据调用Visit函数Status LevelOrderTraverse(BiTree T, Status(*Visit)(TElemType)){    //-------------------------------------    // TODO (#1#): 按层次遍历二叉树BiTree P=T;      SqQueue Q;      InitQueue(Q);   //初始化队列      if(P)      {          EnQueue(Q,P);          while(!QueueEmpty(Q))          {              DeQueue(Q,P);   //出队列              printf("%c",P->data);              if(P->lchild)                  EnQueue(Q,P->lchild);              if(P->rchild)                  EnQueue(Q,P->rchild);          }      }      DestroyQueue(Q);      return OK;      //-------------------------------------}//以直观方式打印二叉树void PrintTree(BiTree t, int level=0){    int i;    if(t) {        PrintTree(t->rchild, level+1);        for(i=0; i<level; i++) printf("    ");        write(t->data); write('\n');        PrintTree(t->lchild, level+1);    }}//构造一个空队列  Status InitQueue(SqQueue &Q)  {      Q.base=(QElemType *)malloc(MAXQSIZE*sizeof(QElemType));      if(!Q.base)          return ERROR;      Q.front=Q.rear=0;      return OK;  }  //元素入队  Status EnQueue(SqQueue &Q,QElemType e)  {      if((Q.rear+1)%MAXQSIZE==Q.front)          return ERROR;      Q.base[Q.rear]=e;      Q.rear=(Q.rear+1)%MAXQSIZE;      return OK;  }  //元素出队  Status DeQueue(SqQueue &Q,QElemType &e)  {      if(Q.front==Q.rear)          return ERROR;      e=Q.base[Q.front];      Q.front=(Q.front+1)%MAXQSIZE;      return OK;  }  //判断队列是否为空  Status QueueEmpty(SqQueue Q)  {      if(Q.rear==Q.front)          return OK;      else          return ERROR;  }  //销毁队列  Status DestroyQueue(SqQueue &Q)  {      if(!Q.base)          return ERROR;      Q.rear=Q.front;      free(Q.base);      return OK;  }  //取消缺省类型的定义以免影响其它部分 #ifdef ELEMTYPE_TAG#undef ElemType#undef ELEMTYPE_TAG#endif#endif //BINTREE_H_INCLUDED
运作图:


完整连接:

点击打开链接

原创粉丝点击