实验四:二叉树的存储结构及遍历
- 实验项目名称:二叉树的存储结构及遍历
- 实验目的及要求:
实验目的
(1)理解二叉树的存储结构的表示和运算的C语言实现。
(2)掌握二叉树的先序遍历、中序遍历、后序遍历及层次遍历。
要求:
(1)设计二叉树的二叉链表存储结构(动态分配存储空间)。
(2)数据元素为字符类型。
(3)创建二叉树的二叉链表。
(4)实现对二叉树的先序遍历、中序遍历、后序遍历及层次遍历算法。
3.实验原理
对于任意的二叉树来说,每个结点只有两个孩子,一个双亲结点。我们可以设计每个结点至少包括三个域:数据域、左孩子域和右孩子域。
二叉树的遍历是指按一定规律对二叉树中的每个结点进行访问且仅访问一次。
二叉树的基本结构由根结点、左子树和右子树组成。用L、D、R分别表示遍历左子树、访问根结点、遍历右子树,我们规定按先左后右的顺序,二叉树的遍历顺序就可以有:访问根,遍历左子树,遍历右子树(记做DLR);遍历左子树,访问根,遍历右子树(记做LDR);遍历右子树,访问根,遍历左子树 (记做RDL)。
先(根)序遍历二叉树的递归定义:
若二叉树为空,则空操作。
否则
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。
中(根)序遍历二叉树的递归定义:
若二叉树为空,则空操作。
否则
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。
后(根)序遍历二叉树的递归定义:
若二叉树为空,则空操作。
否则
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点。
层次遍历:利用队列先进先出的特点,自顶向下,自左向右,将二叉树结点的地址依次进入队列,出队列即可。
4.实验内容:
创建的二叉树为:课本P129 图6.9。
实验步骤:
(1)设计二叉树的二叉链表存储结构。
(2)接收字符,创建二叉链表。
(3)先序遍历二叉树,输出遍历序列。
(4)中序遍历二叉树,输出遍历序列。
(5)后序遍历二叉树,输出遍历序列。
(6)层次遍历二叉树,输出遍历序列。
5.实验结果与分析:
(1)分析实验中所遇到的问题,自己的解决思路及实现方法。
(2)写出自己所用的测试用例,并记录结果。
(3)总结本次实验的收获。
#include <stdio.h>
#include "stdlib.h"
#define ETYPE char
#define QETYPE biTree
typedef struct biTNode{
ETYPE data;
struct biTNode *lchild, *rchild; // Left and right child pointer
}biTNode, *biTree;
typedef struct qNode{
QETYPE data;
struct qNode *next; // queue next pointer
}qNode, *queuePtr;
typedef struct {
queuePtr front; // queue front pointer
queuePtr rear; // queue rear pointer
int length; // queue length
}linkQueue;
// construct an empty queue. return 1 if initialization is successful, 0 otherwise.
int initQueue(linkQueue **qq){
*qq = (linkQueue *)malloc(sizeof(linkQueue));
linkQueue *q = *qq;
q->front = q->rear = (queuePtr)malloc(sizeof(qNode));
// storage allocation failed
if(!q->front){
return 0;
}
q->front->next = NULL