二叉树基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
二叉树基本操作
一、实验目的
1.熟悉二叉树结点的结构和对二叉树的基本操作。
2.掌握对二叉树每一种操作的具体实现。
3.学会利用递归方法编写对二叉树这种递归数据结构进行处理的算法。4.在二叉树基本操作的基础上掌握对二叉树的一些其它操作的具体实现方法。5.掌握构造哈夫曼树以及哈夫曼编码的方法。
二、实验内容(必做1)
程序 1
该程序的功能是实现二叉树结点的类型定义和对二叉树的基本操作。
该程序包括二叉树结构类型以及每一种操作的具体的函数定义和主函数。
/* 定义 DataType 为char类型 */
typedef char DataType;
/* 二叉树的结点类型 */
typedef struct BitNode
{DataType data;
struct BitNode *lchild,*rchild;
}BitNode,*BitTree;
/* 初始化二叉树,即把树根指针置空 */
void BinTreeInit(BitTree *BT)
/* 按先序次序建立一个二叉树*/
void BinTreeCreat(BitTree *BT)
/* 检查二叉树是否为空 */
int BinTreeEmpty(BitTree *BT)
/* 按任一种遍历次序(包括按先序、中序、后序、按层次)输出二叉树中的所有结点 */
void BinTraverse(BitTree *BT)
/* 求二叉树的深度 */
int BinTreeDepth(BitTree BT)
/* 求二叉树中所有结点数 */
int BinTreeCount(BitTree BT)
/* 清除二叉树,使之变为空树 */
void BinTreeClear(BitTree *BT)
程序 2 二叉树采用二叉链表存储,设计按层次遍历二叉树的算法。
设计要求:在程序中构造两个子程序分别为
void BinTreeCreat(BitTree *BT) /* 按前序次序建立一个二叉树*/
void layorder(BitTree T) /*按层次遍历二叉树 */
程序 3
哈夫曼树和哈夫曼编码:
从终端输入若干个字符,统计字符出现的频率,将字符出现的频率作为结点的权值,建立哈夫曼树,然后对各字符进行哈夫曼编码。最后打印哈夫曼树和对应的哈夫曼编码。
设计要求:在程序中构造四个子程序为
int freqchar(char *text, HTree *t) /*统计字符出现的频率*/
int createhtree(HTree *t) /*根据字符出现的频率建立哈夫曼树*/
void coding(HTree *t,int head_i,char *code) /*对哈夫曼树进行编码*/ void printhtree(HTree *t,int head_i,int deep,int* path)/*中序打印树* 三、实例
二叉树的建立和各种遍历算法在教材中,已经有很详细的介绍。本例题将介绍另外一种建立二叉树的算法。同时介绍对“遍历算法”灵活应用:修改原有二叉树中结点的数值;将二叉树中每个结点的左右子树进行交换。介绍求二叉树深度的算法。
本例介绍二叉树的建立是一个递归方法,与二 1 叉树先序遍历思路有点相似。数据的组织是先序遍历的顺序,但是当某结点的某孩子为空时以数据 0 2 3 来充当,也要输入。结合右图的二叉树,其数据的4 5 6
输入顺序应该是:
1 2 4 0 0 0 3 5 0 7 0 0 6 8 0 0 9 0 0。
7 8 9
若当前数据不为 0,则申请一个结点存入当前数据。如果输入 0 表明是空(NULL),不分配结点。递归调用建立函数,建立当前结点的左右子树。
[源程序]
#include
#include
typedef int ElemType;
struct NodeType //定义结点结构体
{ ElemType data;
NodeType *lch,*rch;
};
class BiTree //定义二叉树类 class
{public:
BiTree(){root=NULL;}; //构造函数
~BiTree(){destroy(root) ;} //析构函数
void inorder() //中序遍历
{ inorder(root); }
void preordertswap() //利用先序遍历方法交换左右子树
{ preorderswap(root); }
int theight() //求二叉树高度
{ return height(root); }
void creat0();
private:
NodeType *root; //数据成员,树根
NodeType *creat(); //建立二叉树递归方法
void inorder(NodeType *p); //中序遍历
void preorderswap(NodeType *p); //利用先序遍历方法交换左右子树
int height(NodeType *p); //求二叉树高度递归算法 void destroy(NodeType* &p); //删除二叉树所有结点 };
void BiTree::creat0() //建立树函数,
{ cout<<"请按照树的先序遍历顺序组织数据"< cout<<"若结点信息是 int,把每个结点的空孩子以 0输入;"< root=creat(); //调用私有 creat(); } NodeType * BiTree::creat() //递归建立二叉树算法 { NodeType *p; ElemType x; cout<<"\n 输入数据:"; cin>>x; if( x==0) p=NULL; else { p=new NodeType; p->data=x; p->lch=creat(); //递归调用自身 p->rch=creat(); } return p; } void BiTree::inorder(NodeType *p) //中序遍历 { if(p != NULL) { inorder(p->lch); cout< inorder(p->rch); } } void BiTree::preorderswap(NodeType *p) //利用先序遍历方法交换左右子树 { if(p != NULL) { NodeType *r; r=p->lch; p->lch=p->rch; p->rch=r; //上面几条语句可以认为对结点的访问(交换左右孩子) //替换了原来的: cout< preorderswap(p->lch);