二叉树的实现
来源:互联网 发布:中国网民规模季度数据 编辑:程序博客网 时间: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运作图:
完整连接:
点击打开链接
阅读全文
0 0
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现..
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- 二叉树的实现
- Bellman-Ford算法(求最短路径,并检测负权回路)
- git权威指南总结四:进度保存与恢复
- 【JavaScript】什么时候不能用箭头函数
- lucene查询之 queryparser查询;及代码示例;代码实现;及查询语法解析
- JAVA创建抽象类
- 二叉树的实现
- Manacher算法
- 团队天梯赛L1-017. 到底有多二
- lucene查询之 MulitFieldQueryParser 可以指定多个默认搜索域;及代码示例;代码实现
- LTP 第五章 开发IO操作测试集
- 我心中的软件
- 零基础学SVM—Support Vector Machine系列之一
- Deep Learning读书分享:卷积网络 | 公开课
- 最好奇的Top5连问:你是怎么踏入深度学习大门的?