数据结构二叉树的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构与算法课程实验报告实验四:二叉树的基本操作
姓名:沈靖雯
班级:14信息与计算科学(2)班
学号:2014326601094
实验四二叉树的基本操作
【实验内容】
实现创建和遍历二叉树的基本操作
【实验目的】
掌握二叉树的定义和存储表示,学会建立一棵特定二叉树的方法;掌握二叉树的遍历算法(先序、中序、后序遍历算法)的思想,并学会遍历算法的递归实现和非递归实现。
【问题描述】
(1)编程实现构造一棵二叉树的算法,适合任意合法输入的二叉树的建立,并进行相应异常处理。
(2)编程实现在二叉链表这种存储方式下,实现二叉的遍历,可采用递归或者非递归实现,遍历算法可在先序、中序和后序遍历算法中任
选其一。
【问题实现】
一、实现链队列基本运算
(1)抽象数据类型
ADT BTree {
数据对象D: D是具有相同特性的数据元素的集合。
基本操作:CreatBiTree(*T)
操作结果:构造二叉树T。
PreOrderTraverse(T)
初始条件:二叉树T已存在。
操作结果:先序遍历T。
InOrderTraverse(T)
初始条件:二叉树T已存在。
操作结果:中序遍历T。
PostOrderTraverse(T)
初始条件:二叉树T已存在。
操作结果:后序遍历T。
} ADT BTree
(2)主要实现思路与主要程序代码:
1).首先定义二叉树结点结构;
typedef struct Node
{
char data;
struct Node *lchild,*rchild; //左右孩子指针
}BiTNode,*BTree;
2).其次定义一个二叉树构造函数int CreatBiTree(BTree *T);采用递归先序法构造二叉树;
scanf("%c",&ch);
if(ch==' ')
*T=NULL;//T为空二叉树
else
{
if(!(*T=(BTree)malloc(sizeof(BiTNode)))) return (OVERFLOW);
(*T)->data=ch;
CreatBiTree(&((*T)->lchild));
CreatBiTree(&((*T)->rchild));
}
3).定义遍历函数(递归先序为例);
//先序遍历二叉树,递归实现
void PreOrderTraverse(BTree T)
{
if(T)
{ printf("%c ",T->data);
PreOrderTraverse (T->lchild);
PreOrderTraverse (T->rchild);
}
}
这里用printf代替visit(),简化程序代码;
4).定义主函数,总体完成以上所有函数功能的实现(构建二叉树与遍历二叉树)。
程序运行如图1:
图 1
【总结】
实验结果实现了问题的基本要求。
对该问题的操作使我对二叉树的结构更加了解,尤其在二叉树遍历部分,对
二叉树递归先序、中序、后序遍历的知识有了充分的复习巩固,加深了学习印象。
附件:
源代码:
#include
#include
#define OVERFLOW -2
typedef struct Node
{
char data;
struct Node *lchild,*rchild; //左右孩子指针
}BiTNode,*BTree;
//递归先序法创建二叉树
int CreatBiTree(BTree *T)
{
char ch;
scanf("%c",&ch);
if(ch==' ')
*T=NULL;//T为空二叉树
else
{
if(!(*T=(BTree)malloc(sizeof(BiTNode)))) return (OVERFLOW);
(*T)->data=ch;
CreatBiTree(&((*T)->lchild));
CreatBiTree(&((*T)->rchild));
}
return 0;
}
//先序遍历二叉树,递归实现
void PreOrderTraverse(BTree T)
{
if(T)
{ printf("%c ",T->data);
PreOrderTraverse (T->lchild);
PreOrderTraverse (T->rchild);
}
}
//中序遍历二叉树,递归实现
void InOrderTraverse(BTree T)
{
if(T)
{
InOrderTraverse (T->lchild);
printf("%c ",T->data);
InOrderTraverse (T->rchild);
}
}
//后序遍历二叉树,递归实现
void PostOrderTraverse(BTree T)
{
if(T)
{
PostOrderTraverse (T->lchild);
PostOrderTraverse (T->rchild);
printf("%c ",T->data);
}
}
int main()
{
printf("请按先序次序输入二叉树(空格符表示空树):\n");
BTree T;
CreatBiTree(&T);
printf("递归先序输出:");
PreOrderTraverse(T);
printf("\n递归中序输出:");
InOrderTraverse(T);
printf("\n递归后序输出:");
PostOrderTraverse(T);
return 0;
}