实验三二叉树Word下载.docx
- 文档编号:19868064
- 上传时间:2023-01-11
- 格式:DOCX
- 页数:20
- 大小:74.29KB
实验三二叉树Word下载.docx
《实验三二叉树Word下载.docx》由会员分享,可在线阅读,更多相关《实验三二叉树Word下载.docx(20页珍藏版)》请在冰豆网上搜索。
TElemTypedata;
structBiTNode*lchild;
//左孩子指针
structBiTNode*rchild;
//右孩子指针
}BiTNode,*BiTree;
//-------栈的链式存储结构---------
//LinkStack.h
#defineSTACK_INIT_SIZE20//存储空间初始分配量
#defineSTACKINCREMENT2//存储空间分配增量
typedefstructnode{
SElemTypedata;
structnode*next;
}LinkStack;
//链式栈的结构体定义
//-------基本操作的函数原型说明--------
//关于树的
intPreCreateBiTree(BiTree&
T);
StatusVISIT(TElemTypee);
StatusPreOrderTraverse(BiTreeT,Status(*visit)(TElemTypee));
StatusInOrderTraverse(BiTreeT,Status(*visit)(TElemTypee));
voidMidVisit(BiTree&
voidPostOrderTraverse(BiTreeT,Status(*visit)(TElemTypee));
voidPostOrder(BiTNode*T,Status(*visit)(TElemTypee));
StatusCountLeaf(BiTreeT);
intdeep(BiTreeT);
//关于栈的
StatusInitStack(LinkStack**S);
StatusPush(LinkStack*S,SElemTypex);
StatusPop(LinkStack*S,SElemType&
e);
StatusStackEmpty(LinkStack*S);
StatusGetTop(LinkStack*S,SElemType&
//--------基本操作的实现-----------
//bitree.cpp
#include<
stdio.h>
malloc.h>
stdlib.h>
#include"
common.h"
typedefcharTElemType;
BiTree.h"
typedefBiTreeSElemType;
LinkStack.h"
intn=0;
//构造而二叉链表表示的二叉树
//插入元素,按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树
T)//递归先序建立{
chare;
scanf("
%c"
&
if(e=='
'
){
T=NULL;
return1;
}
T=(BiTree)malloc(sizeof(BiTNode));
if(!
T)
exit(OVERFLOW);
T->
data=e;
//生成根结点
PreCreateBiTree(T->
lchild);
//构造左子树
rchild);
//构造右子树
returnOK;
}
//访问树中元素
StatusVISIT(TElemTypee){
printf("
%c"
e);
//采用递归先序遍历二叉树
StatusPreOrderTraverse(BiTreeT,Status(*visit)(TElemTypee)){
if(T){
if((*visit)(T->
data))
if(PreOrderTraverse(T->
lchild,VISIT))
if(PreOrderTraverse(T->
rchild,VISIT))returnOK;
returnERROR;
else
returnOK;
//采用中序非递归遍历二叉树
StatusInOrderTraverse(BiTreeT,Status(*visit)(TElemTypee)){
LinkStack*S;
BiTreep;
InitStack(&
S);
Push(S,T);
//根指针进栈
while(!
StackEmpty(S)){
while(GetTop(S,p)&
&
p)
Push(S,p->
//向左走到尽头
Pop(S,p);
if(!
StackEmpty(S))
{//访问节点,向右一步
Pop(S,p);
if(!
VISIT(p->
returnERROR;
}
//网上查的
T)//递归中序遍历{
T)
return;
MidVisit(T->
T->
data);
//采用递归后序遍历二叉树(网上查的)
voidPostOrderTraverse(BiTreeT,Status(*visit)(TElemTypee)){
PostOrderTraverse(T->
lchild,VISIT);
rchild,VISIT);
VISIT(T->
//采用非递归后序遍历二叉树(网上查的)
voidPostOrder(BiTNode*T,Status(*visit)(TElemTypee)){
BiTNode*p=T;
BiTNode*stack[30];
intnum=0;
BiTNode*have_visited=NULL;
while(NULL!
=p||num>
0){
while(NULL!
=p){
stack[num++]=p;
p=p->
lchild;
p=stack[num-1];
if(NULL==p->
rchild||have_visited==p->
rchild){
VISIT(p->
num--;
have_visited=p;
p=NULL;
else{
rchild;
//统计二叉树的叶子数
StatusCountLeaf(BiTreeT){
(T->
lchild)&
!
rchild))
n++;
CountLeaf(T->
returnn;
//统计二叉树的深度
intdeep(BiTreeT){
intld,rd;
ld=deep(T->
rd=deep(T->
return(ld+1)>
(rd+1)?
(ld+1):
(rd+1);
//linkstack.cpp
//初始化一个带头结点的空栈
StatusInitStack(LinkStack**S){
*S=(LinkStack*)malloc(sizeof(LinkStack));
if(*S==NULL)
(*S)->
next=NULL;
//入栈操作,将x的数据元素插入栈s中,使x成为新的栈顶元素
StatusPush(LinkStack*S,SElemTypex){
LinkStack*p,*q;
q=S;
p=(LinkStack*)malloc(sizeof(LinkStack));
p->
data=x;
while(q->
next)
q=q->
next;
q->
next=p;
}
//出栈操作,先将栈s的栈顶结点的值送到e所指向的内存单元,然后删除栈顶结点
e){
p=S;
if(S->
next==NULL)
while(p->
next){
q=p;
p=p->
e=p->
data;
free(p);
//判断栈是否为空
StatusStackEmpty(LinkStack*S){
returnTRUE;
else
returnFALSE;
//取栈顶元素
//--------主程序--------
//main.cpp
voidmain(){
BiTreeT;
intHeight,Num;
//树的深度和叶子个数
按先序次序输入二叉树中结点的值,空格表示空树。
请输入:
\n"
);
PreCreateBiTree(T);
先序遍历得到的序列为:
"
PreOrderTraverse(T,VISIT);
中序遍历得到的序列为:
//MidVisit(T);
//递归中序遍历
//printf("
InOrderTraverse(T,VISIT);
后序遍历得到的序列为:
PostOrder(T,VISIT);
//PostOrderTraverse(T,VISIT);
//递归后序遍历
Num=CountLeaf(T);
Height=deep(T);
此树的深度和叶子个数分别为:
%d%d\n"
Height,Num);
2.线索二叉树
//-------二叉树的二叉线索存储表示---------
//BiThrTree.h
typedefenum{Link,Thread}PointerTag;
//Link==0,表示指针;
Thread==1,表示线索
typedefstructBiThrNode{
structBiThrNode*lchild,*rchild;
//左右孩子指针
PointerTagLTag,RTag;
//左右标志
}BiThrNode,*BiThrTree;
BiThrTreePreCreateBiTree();
voidInThreading(BiThrTreep);
BiThrTreeInOrderThreading(BiThrTree&
t,BiThrTreeT);
BiThrTreeInOrderThrTree(BiThrTreeT);
voidInThrTravel(BiThrTreeThre);
//bithrtree.cpp
BiThrTree.h"
BiThrTreepre;
BiThrTreePreCreateBiTree()//递归先序建立{
BiThrTreeT;
)
else{
T=(BiThrTree)malloc(sizeof(BiThrNode));
T->
LTag=Link;
/*初始化时指针标志均为Link*/
RTag=Link;
lchild=PreCreateBiTree();
rchild=PreCreateBiTree();
returnT;
voidInThreading(BiThrTreep){
if(p){
InThreading(p->
//左子树线索化
p->
lchild)
{//前驱线索
p->
LTag=Thread;
lchild=pre;
pre->
rchild)
{//后继线索
pre->
RTag=Thread;
rchild=p;
pre=p;
//保持pre指向p的前驱
//右子树线索化
//中序遍历二叉树T,并将其中序线索化,Thrt指向头结点
t,BiThrTreeT){
t=(BiThrTree)malloc(sizeof(BiThrNode));
t)
t->
t->
//建头结点
rchild=t;
//右指针回指
t->
lchild=t;
else{
lchild=T;
pre=t;
InThreading(T);
//中序遍历进行中序线索化
pre->
pre->
//最后一个结点线索化
rchild=pre;
returnt;
//网上找的
BiThrTreeInOrderThrTree(BiThrTreeT)/*中序线索化二叉树*/{
BiThrTreeThre;
/*Thre为头结点的指针*/
Thre=(BiThrTree)malloc(sizeof(BiThrNode));
Thre->
rchild=Thre;
pre=Thre;
InThreading(T);
returnThre;
/*中序遍历二叉树*/
voidInThrTravel(BiThrTreeThre){
BiThrTreep;
p=Thre->
while(p!
=Thre)/*指针回指向头结点时结束*/
{
LTag==Link)
p->
while(p->
RTag==Thread&
rchild!
=Thre){
printf("
}
p=p->
}
BiThrTreeT,Thre,t;
先序初始化二叉树:
T=PreCreateBiTree();
Thre=InOrderThreading(t,T);
//Thre=InOrderThrTree(T);
//网上找的
中序遍历线索化后的二叉树:
InThrTravel(Thre);
3.赫夫曼树和赫夫曼编码
//-------赫夫曼树和赫夫曼编码的存储表示---------
//HuffmanTree.h
typedefstruct{
unsignedintweight;
//权
unsignedintparent,lchild,rchild;
}HTNode,*HuffmanTree;
//动态分配数组存储赫夫曼树
typedefchar**HuffmanCode;
//动态分配数组存储赫夫曼编码表
intMIN(HuffmanTreet,inti);
voidSelect(HuffmanTreet,intn,int&
s1,int&
s2);
voidHuffmanCoding(HuffmanTree&
HT,HuffmanCode&
HC,int*w,intn);
//huffmantree.cpp
#include<
string.h>
#include"
HuffmanTree.h"
//返回i个结点中权值最小的树的根结点序号
intMIN(HuffmanTreet,inti){
intj,flag;
unsignedintk=65535;
/*取k为无符号整型最大值*/
for(j=1;
j<
=i;
j++){
if(t[j].weight<
k&
t[j].parent==0){/*t[j]是树的根结点*/
k=t[j].weight;
flag=j;
t[flag].parent=1;
/*给选中的根结点的双亲赋1,避免第2次查找该结点*/
returnflag;
//在i个结点中选择2个权值最小的树的根结点序号,s1为其中序号小的那个
voidSelect(HuffmanTreet,in
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验三 二叉树 实验 二叉