、实验目的和要求
(1)掌握树的相关概念,包括树、节点的度、树的度、分支节点、叶子节点、孩子节点、双亲节 点、树的深度、森林等定义。
(2)掌握树的表示,包括树形表示法、文氏图表示法、凹入表示法和括号表示法等。
(3)掌握二叉树的概念,包括二叉树、满二叉树和完全二叉树的定义。
(4)掌握二叉树的性质。
(5)重点掌握二叉树的存储结构,包括二叉树顺序存储结构和链式存储结构。
(6)重点掌握二叉树的基本运算和各种遍历算法的实现
(7)掌握线索二叉树的概念和相关算法的实现。
(8)掌握哈夫曼树的定义、哈夫曼树的构造过程和哈夫曼编码的产生方法。
(9)掌握并查集的相关概念和算法。
(10)灵活运用二叉树这种数据结构解决一些综合应用问题。
二、实验内容
注:二叉树b为如图7-123所示的一棵二叉树
B
图7-123+
实验7.1  编写一个程序algo7-1.cpp,实现二叉树的各种运算,并在此基础上设计一个程序 exp7-1.cpp完成如下功能:
(1)输出二叉树b;
(2)输出H节点的左、右孩子节点值;
(3)输出二叉树b的深度;
(4)输出二叉树b的宽度;
(5)输出二叉树b的节点个数;
(6)输出二叉树b的叶子节点个数。
实验7.2设计一个程序exp7-2.cpp,实现二叉树的先序遍历、中序遍历和后序遍历和非递归算法, 以及层次变量里的算法。并对图7-123所示的二叉树b给出求解结果。

实验7.3对如图7-123所示的二叉树,设计一个程序exp7-3.cpp,完成如下功能:
(1)输出所有的叶子节点;
(2)输出所有从叶子节点到根节点的路径;
(3)输出(2)中的第一条最长的路径。
实验过程描述
实现二叉树的各种的基础程序algo7-1.cpp如下:
的1501-1.CPP
include《stdio.h》
uinclude<malloc.h>
ndefine  Maxsize  100
typde    char  ElemType
typedef  struct  node
{
//数据元素
1/指向左孩子
1/指向右孩子
tb chr    str) 1 / 由 s t r
ElemType  data;
strc      node  *llld
stuc    node  rchild
》BTHode;
vld      ceaeBNodeBNoe
{
BTNode    *St[MaxSize],*p=NULL;
int    top=-1k,j=8
char      ch;
h=HULL;                //建立的二又树初始时为空
ch=str[]];
uhile (ch?-'18 ·)    //str未扫描完时循环
{
switch  ch
{
//为左结点
//为右结点
//p拍向二叉树的根结点
/7已建立二叉树根结点
case  (top++St[top=pk=1          break ;
case  ):top--  break ;
case    ,k-2  break ;
defalt    =Bode      *)malloc(sizeoF  BINode)
p->data-ch;p->ichild-p->rchild-HULL;
if(b==HULL)
b=p;
else
{
swith  k
case    1:St[top]->1child=p;break;
case    2:St[top]-》rchild=p;break;
}
陆山607-1.CPP
}
j+;
ch=str[j1;
BTNode *FindNode(BTNode *b,ElenType x) //返回data域为x的结点指针
8THode *p;
if(D==NULL)
retn    ULL
eleif  (b->data==x
retun  b
else
{
p=FindNode(b->lchild,x);
if (p?-NULL)
retun  p
else
reun  inNode(b->childx;
}
BTNode *LchildHode(BTHode xp)  //返回p结点的左孩子结点指针
{
retur  plcild
二叉树定义BTNode *Rchl1dNode(BTNode *p)  1/返回p结点的右孩子结点指针
return p->rchild
}
int BTNodeDepth(BTNode xb) /求二叉树b的深虎
in      iniddeprcilddep;
if(b--HULL)
■回×
al607-1.CP8
if(b--HULL)
return (0);                                //空树的高度为0
else
lchilddep=BTNodeDepth(b->lchild);      //求左子树的高度为1childdep
rcnilddep=BTNodepepth(b->rchild);      1/求右子树的高度为rchilddep
run    (lhldep>ciddep?lcildde*1(chlddep1
u
oi d DispBTNode(BTNode xb) 77以括号表示法输出二叉树
if(b?-HULL)
{
printf(%c",b->data);
iF(b->Ichild?-HULLIIb->rchild?-HULL)
printf(”(");
pisp8THode(b->lchild);
if(b->rchild?=NULL)printf(",");
DispBTNode(b->rchild);
printf(")"');
int BTWidth(BTNode *b)//求二叉树D的宽度
struct
{
int 100;
8INode *p; }dulMaxsi2e];
int front,rear;
int ]nun.max,i,n;
front=rear=0; if(b?-HULL)
/7结点的层次编号
/7结点指针
/1定义顺序非循环队列
//定义队首和队尾指针
/置队列为空队
臣1607-1.CPP
if(b?-HULL)

re3P4+;
Qu[rear]-p-b;
Qu[rear].1no=1;
while(reart=front)
{
Front++;
b=Qu[front]-P;
lnum-Qu[front].1no;
if(b->Ichildt=NULL)
rpar+t;
Qu[rear]-p=b->1child; Qu[rear].Ino-lnun+1;
if(D->rch11d?=NULL)
1/根结点指针入队
//根结点的层次编号为1
1/队列不为空
1/队头出队
1/左孩子入队
1/右孩子入队


版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。