数据结构实验五 树的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验六二叉树的基本操作
一、实验目的
1.掌握二叉树的基本概念;
2.掌握二叉树的二叉链表的存储结构;
3.掌握利用括号法表示二叉树的的构建方法,以及先、中、后序遍历和层序遍历的实现。
二、实验相关知识
1.复习C语言文件读写的相关知识
2.复习课本中第6章关于数的相关知识点;
三、实验内容与要求
1.建立一棵用二叉链表方式存储的二叉树,并利用凹凸法进行二叉树的打印;并对其进行遍历(先序、中序、后序和层序),并打印输出遍历结果。
【设计要求】输入为括号法表示的二叉树字符串序列,补充完整以下函数,实现二叉链表的建立,二叉树的遍历、以及二叉树的竖向打印。
void CreateBiTree(BiTree *bt)
/*扩展的先序遍历结果构造二叉链表*/
void PreOrder(BiTree root)/*先序遍历二叉树*/
void PostOrder(BiTree root) /* 后序遍历二叉树*/
void InOrder(BiTree root) /* 中序遍历二叉树的非递归算法 */
int LayerOrder(BiTree bt) /* 层序遍历二叉树 */
void PrintTree(BiTree bt,int nLayer) /* 按竖向树状打印的二叉树 */
【测试用例】设有以下的二叉树:
则添加空孩子进行扩展之后:
1、输入:A(B(C,D(E,F(G))))
2、输出:
先序遍历:ABCDEFG
中序遍历:CBEDGFA
后序遍历:CEGFDBA
层序遍历:ABCDEFG
打印二叉树:
A
F
G
D
E
B
C
四、程序代码及运行结果
【程序代码】
#include
#include
#include
typedef char DataType;
//二叉链表的结点结构定义
typedef struct Node
{
DataType data;
struct Node *LChild;
struct Node *RChild;
}BiTNode, *BiTree;
typedef BiTree StackElementType;
typedef BiTree QueueElementType;
#include"stack.h"
#include"queue.h"
//构造二叉链表
void CreateBiTree(BiTNode *&bt, char *str1) {
BiTNode *St[Stack_Size], *p = NULL;
int top = -1, k = 0, j = 0;
char ch;
bt = NULL;
ch = str1[j];
while (ch != '\0')
{
switch (ch)
{
case'(':top++;
St[top] = p;
k = 1;
break;
case')':top--;
break;
case',':k = 2;
break;
default:p = (BiTNode *)malloc(sizeof(BiTNode));
p->data = ch;
p->LChild = p->RChild = NULL;
if (bt == NULL)
bt = p;
else
{
switch (k)
{
case 1:St[top]->LChild = p; break;
case 2:St[top]->RChild = p; break;
}
}
}
j++;
ch = str1[j];
}
}
void Visit(BiTree root)
{
if (root != NULL)
printf("%c ", root->data);
}
/*先序遍历二叉树, root为指向二叉树根结点的指针*/
void PreOrder(BiTree root)
{
if (root != NULL)
{
printf("%c ", root->data);
PreOrder(root->LChild);
PreOrder(root->RChild);
}
}
/* 后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/ void PostOrder(BiTree root)
{
if (root != NULL)
{
PostOrder(root->LChild);
PostOrder(root->RChild);
printf("%c ", root->data);
}
}
void InOrder(BiTree root) /* 中序遍历二叉树的非递归算法 */
{
if (root != NULL)
{
InOrder(root->LChild);
printf("%c ", root->data);
InOrder(root->RChild);
}
}
void PrintTree(BiTree bt, int nLayer) /* 按竖向树状打印的二叉树 */ {
if (bt == NULL)
return;
PrintTree(bt->RChild, nLayer + 3);
for (int i = 0; i < nLayer; i++)
printf(" ");
printf("%c\n", bt->data);
PrintTree(bt->LChild, nLayer + 3);
}
void LayerOrder(BiTree bt) /* 层序遍历二叉树 */
{
BiTree p;
BiTree qu[Stack_Size];
int front, rear;
front = rear = -1;
rear++;
qu[rear] = bt;
while (front != rear)
{
front = (front + 1) % Stack_Size;
p = qu[front];
printf("%c ", p->data);
if (p->LChild != NULL)
{
rear = (rear + 1) % Stack_Size;
qu[rear] = p->LChild;
}
if (p->RChild != NULL)