创建一个二叉树并输出三种遍历结果

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验报告

课程名称数据结构

实验项目实验三--创建一个二叉树并输出三种遍历结果

系别___ _计算机学院 _ ______

专业___ ___

班级/学号___________

学生姓名 _________

实验日期_

成绩_______________________

指导教师

实验题目:实验三------创建一个二叉树并输出三种遍历结果

一、实验目的

1)掌握二叉树存储结构;

2)掌握并实现二叉树遍历的递归算法和非递归算法;

3)理解树及森林对二叉树的转换;

4)理解二叉树的应用—哈夫曼编码及WPL计算。

二、实验内容

1)以广义表或遍历序列形式创建一个二叉树,存储结构自选;

2)输出先序、中序、后序遍历序列;

3)二选一应用题:1)树和森林向二叉树转换;2)哈夫曼编码的应用

问题。(应用型题目可替换上述前两项实验内容)

三、设计与编码

1)程序结构基本设计框架

(提示:请根据所选定题目,描述程序的基本框架,可以用流程图、界面描述图、框图等来表示)

2)本实验用到的理论知识

遍历二叉树,递归和非递归的方法

(提示:总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,要求结合自己的题目并阐述自己的理解和想法)

3)具体算法设计

(1)首先,定义二叉树的存储结构为二叉链表存储,每个元素的数据类型Elemtype,定义一棵二叉树,只需定义其根指针。(2)然后以递归的先序遍历方法创建二叉树,函数为

CreateTree(),在输入字符时要注意,当节点的左孩子或者右

孩子为空的时候,应当输入一个特殊的字符(本算法为“#”),

表示左孩子或者右孩子为空。

(3)下一步,创建利用递归方法先序遍历二叉树的函数,函数为PreOrderTree(),创建非递归方法中序遍历二叉树的函数,

函数为InOrderTree(),中序遍历过程是:从二叉树的根节点

开始,沿左子树向下搜索,在搜索过程将所遇到的节点进栈;

左子树遍历完毕后,从栈顶退出栈中的节点并访问;然后再用

上述过程遍历右子树,依次类推,指导整棵二叉树全部访问完

毕。创建递归方法后序遍历二叉树的函数,函数为

LaOrderTree()。

(提示:该部分主要是利用C、C++等完成数据结构定义、设计算法实现各种操作,可以用列表分步形式的自然语言描述,也可以利用流程图等描述)

4)编码

#include<>

#include<>

#include<>

typedef char DataType;

#define MaxSize 100

typedef struct Node

{

DataType data;

struct Node *lchild;

struct Node *rchild;

}

*BiTree,BitNode;

void InitBitTree(BiTree *T); /*树的初始化*/

void CreateBitTree(BiTree *T); /*按照先序输入字符序列递归创建二叉树*/

void PreOrderTraverse(BiTree T); /*二叉树的先序遍历的递归函数声明*/

void InOrderTraverse(BiTree T); /*二叉树的中序遍历的递归函数声明*/

void PostOrderTraverse(BiTree T); /*二叉树的后序遍历的递归函数声明*/

void PreOrderTraverse2(BiTree T); /*二叉树的先序遍历的非递归函数声明*/

void InOrderTraverse2(BiTree T); /*二叉树的中序遍历的非递归函数声明*/

void PostOrderTraverse2(BiTree T); /*二叉树的后序遍历的非递归函数声明*/

void main()

{

BiTree T,root;

InitBitTree(&T);

printf("根据输入二叉树的先序序列创建二叉树('#'表示结束):\n");

CreateBitTree(&T);

printf("二叉树的先序序列:\n");

printf("递归:\t");

PreOrderTraverse(T);

printf("\n");

printf("非递归:");

PreOrderTraverse2(T);

printf("\n");

printf("二叉树的中序序列:\n");

printf("递归:\t");

InOrderTraverse(T);

printf("\n");

printf("非递归:");

InOrderTraverse2(T);

printf("\n");

printf("二叉树的后序序列:\n");

printf("递归:\t");

PostOrderTraverse(T);

printf("\n");

printf("非递归:");

PostOrderTraverse2(T);

printf("\n");

}

void InitBitTree(BiTree *T)

{

*T=NULL;

}

void CreateBitTree(BiTree *T)

/*递归创建二叉树*/

{

DataType ch;

scanf("%c",&ch);

if(ch=='#')

*T=NULL;

else

{

*T=(BiTree)malloc(sizeof(BitNode)); /*生成根结点*/

if(!(*T))

exit(-1);

(*T)->data=ch;

CreateBitTree(&((*T)->lchild)); /*构造左子树*/

CreateBitTree(&((*T)->rchild)); /*构造右子树*/

相关文档
最新文档