数据结构二叉树的基本操作

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

}

相关文档
最新文档