数据结构 【实验7 二叉树基本操作】

实验7   二叉树基本操作

实验目的

1.  熟悉二叉树结点的结构和对二叉树的基本操作。

2.  掌握对二叉树每一种操作的具体实现。

3.  学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。

实验内容

该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。

/* 定义DataType为char类型 */

typedef char DataType;

/* 二叉树的结点类型 */

typedef struct BitNode

{DataType data;

struct BitNode *lchild,*rchild;

}BitNode,*BitTree;

/* 初始化二叉树,即把树根指针置空 */

void BinTreeInit(BitTree *BT)

/* 按先序次序建立一个二叉树*/

void BinTreeCreat(BitTree *BT)

/* 检查二叉树是否为空 */

int BinTreeEmpty(BitTree *BT)

/* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */

void BinTraverse(BitTree *BT)

/* 求二叉树的深度 */

int BinTreeDepth(BitTree BT)

/* 求二叉树中所有结点数 */

int  BinTreeCount(BitTree BT)

/* 清除二叉树,使之变为空树 */

void BinTreeClear(BitTree *BT)


  1 #include <iostream>
  2 #include <stdio.h>
  3 #include <queue>
  4 using namespace std;
  5
  6 /* 实验内容
  7 该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。
  8 */
  9
 10 /* 定义DataType为char类型 */
 11 typedef char DataType;
 12
 13 /* 二叉树的结点类型 */
 14 typedef struct BitNode{
 15     DataType data;
 16     struct BitNode *lchild,*rchild;
 17 }BitNode,*BitTree;
 18
 19 /* 初始化二叉树,即把树根指针置空 */
 20 void BinTreeInit(BitTree &BT)
 21 {
 22     BT = NULL;
 23 }
 24
 25 /* 按先序次序建立一个二叉树*/
 26 void BinTreeCreat(BitTree &BT)
 27 {
 28     //printf("请输入该节点的元素值:");
 29     scanf("%c",&BT->data);
 30     while(BT->data==‘ ‘ || BT->data==‘\n‘){
 31         scanf("%c",&BT->data);
 32     }
 33     if(BT->data==‘#‘){    //输入为‘#‘说明该节点为空,返回上一步
 34         BT=NULL;
 35         return ;
 36     }
 37     BT->lchild = (BitNode*)malloc(sizeof(BitNode));
 38     BT->rchild = (BitNode*)malloc(sizeof(BitNode));
 39     printf("请输入%c的左节点\n",BT->data);
 40     BinTreeCreat(BT->lchild);
 41     printf("请输入%c的右节点\n",BT->data);
 42     //printf("进入右子树\n");
 43     BinTreeCreat(BT->rchild);
 44 }
 45
 46 /* 检查二叉树是否为空 */
 47 int BinTreeEmpty(BitTree BT)
 48 {
 49     if(BT==NULL)
 50         return 1;
 51     else
 52         return 0;
 53 }
 54
 55 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 56 void BinTraverse1(BitTree BT)    //按前序遍历
 57 {
 58     if(BT==NULL)    //递归出口
 59         return ;
 60     printf("%c",BT->data);
 61     BinTraverse1(BT->lchild);
 62     BinTraverse1(BT->rchild);
 63 }
 64
 65 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 66 void BinTraverse2(BitTree BT)    //按中序遍历
 67 {
 68     if(BT==NULL)    //递归出口
 69         return ;
 70     BinTraverse2(BT->lchild);
 71     printf("%c",BT->data);
 72     BinTraverse2(BT->rchild);
 73 }
 74
 75 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 76 void BinTraverse3(BitTree BT)    //按后序遍历
 77 {
 78     if(BT==NULL)    //递归出口
 79         return ;
 80     BinTraverse3(BT->lchild);
 81     BinTraverse3(BT->rchild);
 82     printf("%c",BT->data);
 83 }
 84
 85 /* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
 86 void BinTraverse4(BitTree BT)    //按层次遍历
 87 {
 88     queue <BitTree> q;
 89     BitTree cur = BT;
 90     q.push(cur);
 91     while(!q.empty()){    //队列空为止
 92         cur = q.front();
 93         q.pop();
 94         if(cur==NULL)    //遇到空节点退出本次循环
 95             continue;
 96         printf("%c",cur->data);    //输出当前节点元素
 97         q.push(cur->lchild);    //将该节点的两个孩子节点入栈
 98         q.push(cur->rchild);
 99     }
100 }
101
102 /* 求二叉树的深度 */
103 int BinTreeDepth(BitTree BT)
104 {
105     if(BT==NULL)    //递归出口
106         return 0;
107     //记录左子树深度和右子树深度,返回较大的深度+1
108     int ldp = BinTreeDepth(BT->lchild);
109     int rdp = BinTreeDepth(BT->rchild);
110     return ldp>rdp?ldp+1:rdp+1;
111 }
112
113 /* 求二叉树中所有结点数 */
114 int  BinTreeCount(BitTree BT)
115 {
116     if(BT==NULL)    //递归出口
117         return 0;
118     //返回左子树节点数和右子树节点数再加上当前节点
119     return BinTreeCount(BT->lchild) + BinTreeCount(BT->rchild) + 1;
120 }
121
122 /* 清除二叉树,使之变为空树 */
123 void BinTreeClear(BitTree &BT)
124 {
125     if(BT==NULL)    //递归出口
126         return ;
127     //左右子树找到底,然后返回的时候依次销毁空间
128     BinTreeClear(BT->lchild);
129     BinTreeClear(BT->rchild);
130     free(BT);
131     BT=NULL;
132 }
133
134 int Menu()    //菜单
135 {
136     int n;
137     printf("[1] 按先序次序建立一个二叉树\n");
138     printf("[2] 检查二叉树是否为空\n");
139     printf("[3] 按先序输出二叉树中的所有结点\n");
140     printf("[4] 按中序输出二叉树中的所有结点\n");
141     printf("[5] 按后序输出二叉树中的所有结点\n");
142     printf("[6] 按层次输出二叉树中的所有结点\n");
143     printf("[7] 求二叉树的深度\n");
144     printf("[8] 求二叉树中所有结点数\n");
145     printf("[9] 清除二叉树,使之变为空树\n");
146     printf("[0] 退出\n");
147     scanf("%d",&n);
148     return n;
149 }
150
151 void Reply(BitTree &BT,int n)    //对菜单的响应
152 {
153     switch(n){
154     case 1:    //创建二叉树
155         if(BT!=NULL)
156             printf("已创建二叉树! 请先清除二叉树再创建!\n");
157         else{    //二叉树为空
158             printf("按先序依次增加节点,输入‘#‘表示空节点!\n\n");
159             BT = (BitNode*)malloc(sizeof(BitNode));    //创建根节点
160             BT->lchild = NULL;
161             BT->rchild = NULL;
162             printf("请输入根节点的元素值:\n");
163             BinTreeCreat(BT);
164             printf("\n二叉树创建成功!\n\n");
165         }
166         break;
167     case 2:    //检查二叉树是否为空
168         if(BinTreeEmpty(BT))
169             printf("二叉树为空!\n\n");
170         else
171             printf("二叉树不为空!\n\n");
172         break;
173     case 3:    //按前序遍历
174         if(BT==NULL){
175             printf("二叉树为空!无法遍历!\n\n");
176             break;
177         }
178         printf("前序遍历顺序为:\n");
179         BinTraverse1(BT);
180         printf("\n\n");
181         break;
182     case 4:    //按中序遍历
183         if(BT==NULL){
184             printf("二叉树为空!无法遍历!\n\n");
185             break;
186         }
187         printf("中序遍历顺序为:\n");
188         BinTraverse2(BT);
189         printf("\n\n");
190         break;
191     case 5:    //按后序遍历
192         if(BT==NULL){
193             printf("二叉树为空!无法遍历!\n\n");
194             break;
195         }
196         printf("后序遍历顺序为:\n");
197         BinTraverse3(BT);
198         printf("\n\n");
199         break;
200     case 6:    //按层次遍历
201         if(BT==NULL){
202             printf("二叉树为空!无法遍历!\n\n");
203             break;
204         }
205         printf("层次遍历顺序为:\n");
206         BinTraverse4(BT);
207         printf("\n\n");
208         break;
209     case 7:    //求二叉树的深度
210         printf("二叉树的深度为:%d\n\n",BinTreeDepth(BT));
211         break;
212     case 8:    //求二叉树的节点数
213         printf("二叉树的总结点数为:%d\n\n",BinTreeCount(BT));
214         break;
215     case 9:    //清除二叉树
216         if(BT==NULL){
217             printf("二叉树已经为空!无需清空!\n\n");
218             break;
219         }
220         BinTreeClear(BT);
221         printf("清除成功!\n\n");
222         break;
223     default:
224         exit(1);
225     }
226     system("pause");
227     system("cls");
228 }
229
230 int main()
231 {
232     BitTree BT = NULL;
233     BinTreeInit(BT);    //初始化二叉树
234     while(1){
235         int n = Menu();
236         Reply(BT,n);
237     }
238     return 0;
239 }

Freecode : www.cnblogs.com/yym2013

数据结构 【实验7 二叉树基本操作】

时间: 2024-12-18 15:38:12

数据结构 【实验7 二叉树基本操作】的相关文章

数据机构实验报告-实验三 二叉树基本操作的实现

实验三   二叉树基本操作的实现   l  实验目的 1.二叉树的基本操作 (1)掌握二叉树链表的结构和二叉排序树的建立过程. (2)掌握二叉树排序树的插入和删除操作. (3)加深对二叉树的理解,逐步培养解决实际问题的编程能力. 2.树的遍历和哈夫曼树 (1)掌握用递归方法实现二叉树遍历的操作. (2)掌握用非递归方法实现二叉树遍历的操作. (3)掌握建立Huffman树的操作. (4)加深对二叉树的理解,逐步培养解决实际问题的编程能力. l  实验内容 1.二叉树的基本操作 (一)基础题 (1

SDUT 3343 数据结构实验之二叉树四:还原二叉树

数据结构实验之二叉树四:还原二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定一棵二叉树的先序遍历序列和中序遍历序列,要求计算该二叉树的高度. Input 输入数据有多组,每组数据第一行输入1个正整数N(1 <= N <= 50)为树中结点总数,随后2行先后给出先序和中序遍历序列,均是长度为N的不包含重复英文字母(区分大小写)的字符串. Output 输出一个整数,即该二叉树的

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu

SDUT 3342 数据结构实验之二叉树三:统计叶子数

数据结构实验之二叉树三:统计叶子数 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并求二叉树的叶子结点个数. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 输出二叉树的叶子结点个数. Example Input abc,,de,g,,f

SDUT 3340 数据结构实验之二叉树一:树的同构

数据结构实验之二叉树一:树的同构 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 给定两棵树T1和T2.如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是"同构"的.例如图1给出的两棵树就是同构的,因为我们把其中一棵树的结点A.B.G的左右孩子互换后,就得到另外一棵树.而图2就不是同构的. 图1 图2 现给定两棵树,请你判断它们是否是同构的. Input 输入数据包含

SDUT 3341 数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行:第1行输出中序遍历序列:第2行输出后序遍历序列

SDUT 3344 数据结构实验之二叉树五:层序遍历

数据结构实验之二叉树五:层序遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立二叉树并求二叉树的层次遍历序列. Input 输入数据有多行,第一行是一个整数t (t<1000),代表有t行测试数据.每行是一个长度小于50个字符的字符串. Output 输出二叉树的层次遍历序列. Example I

SDUT 3345 数据结构实验之二叉树六:哈夫曼编码

数据结构实验之二叉树六:哈夫曼编码 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 字符的编码方式有多种,除了大家熟悉的ASCII编码,哈夫曼编码(Huffman Coding)也是一种编码方式,它是可变字长编码.该方法完全依据字符出现概率来构造出平均长度最短的编码,称之为最优编码.哈夫曼编码常被用于数据文件压缩中,其压缩率通常在20%-90%之间.你的任务是对从键盘输入的一个字符串求出它的ASCII编码长度和哈夫曼

SDUT-3441_数据结构实验之二叉树二:遍历二叉树

数据结构实验之二叉树二:遍历二叉树 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知二叉树的一个按先序遍历输入的字符序列,如abc,,de,g,,f,,, (其中,表示空结点).请建立二叉树并按中序和后序的方式遍历该二叉树. Input 连续输入多组数据,每组数据输入一个长度小于50个字符的字符串. Output 每组输入数据对应输出2行: 第1行输出中序遍历序列: 第2行输出后序遍历序列. Sample Inp