资源描述
《数据结构》课程实验报告
实验名称
树与二叉树
实验序号
5
实验日期
姓 名
院系
班 级
学 号
专 业
指导教师
成 绩
教师评语
一、实验目得与要求
(1)掌握树得相关概念,包括树、结点得度、树得度、分支结点、叶子结点、儿子结点、双亲结点、树得深度、森林等定义。
(2)掌握树得表示,包括树形表示法、文氏图表示法、凹入表示法与括号表示法等。
(3)掌握二叉树得概念,包括二叉树、满二叉树与完全二叉树得定义。
(4)掌握二叉树得性质。
(5)重点掌握二叉树得存储结构,包括二叉树顺序存储结构与链式存储结构。
(6)重点掌握二叉树得基本运算与各种遍历算法得实现。
(7)掌握线索二叉树得概念与相关算法得实现。
(8)掌握哈夫曼树得定义、哈夫曼树得构造过程与哈夫曼编码产生方法。
(9)掌握并查集得相关概念与算法。
(10)灵活掌握运用二叉树这种数据结构解决一些综合应用问题。
二、实验项目摘要
1.编写一程序,实现二叉树得各种基本运算,并在此基础上设计一个主程序完成如下功能:
(1) 输出二叉树b;
(2) 输出H结点得左、右孩子结点值;
(3) 输出二叉树b得深度;
(4) 输出二叉树b得宽度;
(5) 输出二叉树b得结点个数;
(6) 输出二叉树b得叶子结点个数。
2.编写一程序,实现二叉树得先序遍历、中序遍历与后序遍历得各种递归与非递归算法,以及层次遍历得算法。
三、实验预习内容
二叉树存储结构,二叉树基本运算(创建二叉树、寻找结点、找孩子结点、求高度、输出二叉树)
三、实验结果与分析
7-1
#include <stdio、h>
#include <malloc、h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ﻩElemType data; ﻩ
struct node *lchild;
ﻩstruct node *rchild;ﻩ
} BTNode;
void CreateBTNode(BTNode *&b,char *str)
{
ﻩBTNode *St[MaxSize],*p=NULL;
ﻩint top=-1,k,j=0;
char ch;
b=NULL;ﻩﻩ ﻩ
ch=str[j];
while (ch!='\0')
ﻩ{
switch(ch)
{
ﻩcase '(':top++;St[top]=p;k=1; break; ﻩ
ﻩﻩcase ')':top--;break;
ﻩﻩcase ',':k=2; break;
ﻩdefault:p=(BTNode *)malloc(sizeof(BTNode));
ﻩ p->data=ch;p->lchild=p->rchild=NULL;
if (b==NULL)
ﻩ ﻩ b=p;
ﻩ ﻩelse ﻩ ﻩ ﻩﻩ
ﻩ ﻩ{
ﻩﻩﻩ ﻩﻩswitch(k)
ﻩ ﻩﻩﻩﻩ{
ﻩ ﻩ ﻩ case 1:St[top]->lchild=p;break;
ﻩﻩﻩ case 2:St[top]->rchild=p;break;
ﻩﻩ ﻩ }
ﻩﻩﻩ }
ﻩﻩ}
j++;
ﻩ ch=str[j];
ﻩ}
}
BTNode *FindNode(BTNode *b,ElemType x)
{
ﻩBTNode *p;
ﻩif (b==NULL)
ﻩ return NULL;
else if (b->data==x)
ﻩ return b;
else
ﻩ{ﻩ
ﻩ p=FindNode(b->lchild,x);
ﻩﻩif (p!=NULL)
ﻩ ﻩreturn p;
ﻩ else
ﻩﻩreturn FindNode(b->rchild,x);
}
}
BTNode *LchildNode(BTNode *p)
{
return p->lchild;
}
BTNode *RchildNode(BTNode *p)
{
return p->rchild;
}
int BTNodeDepth(BTNode *b)
{
int lchilddep,rchilddep;
if (b==NULL)
ﻩ return(0); ﻩ ﻩﻩﻩ
else
ﻩ{
ﻩlchilddep=BTNodeDepth(b->lchild);ﻩ
ﻩ ﻩrchilddep=BTNodeDepth(b->rchild);ﻩ
ﻩﻩreturn (lchilddep>rchilddep)? (lchilddep+1):(rchilddep+1);
ﻩ}
}
void DispBTNode(BTNode *b)
{
ﻩif (b!=NULL)
{
ﻩ printf("%c",b->data);
ﻩif (b->lchild!=NULL || b->rchild!=NULL)
ﻩ {
ﻩprintf("(");
ﻩﻩ DispBTNode(b->lchild);
ﻩﻩ if (b->rchild!=NULL) printf(",");
ﻩﻩﻩDispBTNode(b->rchild);
ﻩ printf(")");
ﻩﻩ}
}
}
int BTWidth(BTNode *b)
{
struct
{
ﻩﻩint lno;
ﻩﻩBTNode *p;ﻩ
} Qu[MaxSize];ﻩ
int front,rear; ﻩ ﻩ ﻩ
ﻩint lnum,max,i,n;
ﻩfront=rear=0;ﻩﻩﻩ ﻩﻩ
if (b!=NULL)
{
rear++;ﻩ
ﻩQu[rear]、p=b; ﻩﻩ ﻩ
ﻩ Qu[rear]、lno=1;ﻩﻩ ﻩﻩ
while (rear!=front) ﻩ
{
ﻩﻩﻩfront++;
ﻩﻩ b=Qu[front]、p; ﻩﻩ
ﻩﻩ lnum=Qu[front]、lno;
if (b->lchild!=NULL)ﻩﻩ
ﻩﻩ{
ﻩﻩ rear++;
ﻩ Qu[rear]、p=b->lchild;
ﻩﻩﻩQu[rear]、lno=lnum+1;
ﻩﻩ }
ﻩif (b->rchild!=NULL)
ﻩﻩ{
ﻩﻩ rear++;
ﻩ ﻩﻩQu[rear]、p=b->rchild;
ﻩﻩﻩﻩQu[rear]、lno=lnum+1;
ﻩﻩ }
}
ﻩmax=0;lnum=1;i=1;
while (i<=rear)
ﻩ {
ﻩ ﻩn=0;
ﻩwhile (i<=rear && Qu[i]、lno==lnum)
{
n++;i++;
ﻩﻩﻩ}
ﻩﻩ lnum=Qu[i]、lno;
ﻩ ﻩif (n>max) max=n;
ﻩﻩ}
return max;
ﻩ}
else
ﻩ return 0;
}
int Nodes(BTNode *b)
{
ﻩint num1,num2;
if (b==NULL)
ﻩ return 0;
else if (b->lchild==NULL && b->rchild==NULL)
return 1;
else
{
num1=Nodes(b->lchild);
num2=Nodes(b->rchild);
return (num1+num2+1);
}
}
int LeafNodes(BTNode *b)
{
ﻩint num1,num2;
if (b==NULL)
return 0;
else if (b->lchild==NULL && b->rchild==NULL)
return 1;
else
{
num1=LeafNodes(b->lchild);
num2=LeafNodes(b->rchild);
return (num1+num2);
}
}
void main()
{
BTNode *b,*p,*lp,*rp;;
CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
ﻩprintf("输出二叉树:");DispBTNode(b);printf("\n");
ﻩprintf("'H'结点:");
p=FindNode(b,'H');
if (p!=NULL)
ﻩ{
ﻩ lp=LchildNode(p);
ﻩ if (lp!=NULL)
ﻩﻩprintf("左孩子为%c ",lp->data);
ﻩ else
printf("无左孩子 ");
rp=RchildNode(p);
ﻩ if (rp!=NULL)
ﻩprintf("右孩子为%c",rp->data);
ﻩﻩelse
printf("无右孩子 ");
ﻩ}
printf("\n");
ﻩprintf("二叉树b得深度:%d\n",BTNodeDepth(b));
printf("二叉树b得宽度:%d\n",BTWidth(b));
printf("二叉树b得结点个数:%d\n",Nodes(b));
printf("二叉树b得叶子结点个数:%d\n",LeafNodes(b));
}
7-2
#include <stdio、h>
#include <malloc、h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ﻩElemType data;
struct node *lchild; ﻩ
ﻩstruct node *rchild;
} BTNode;
void CreateBTNode(BTNode *&b,char *str)
{
ﻩBTNode *St[MaxSize],*p=NULL;
ﻩint top=-1,k,j=0;
ﻩchar ch;
ﻩb=NULL;ﻩ
ch=str[j];
ﻩwhile (ch!='\0')
ﻩ{
ﻩ switch(ch)
ﻩﻩ{
ﻩ case '(':top++;St[top]=p;k=1; break; ﻩ
ﻩ case ')':top--;break;
case ',':k=2; break; ﻩ
default:p=(BTNode *)malloc(sizeof(BTNode));
ﻩ ﻩp->data=ch;p->lchild=p->rchild=NULL;
ﻩ ﻩif (b==NULL)
ﻩﻩ ﻩ b=p;
ﻩﻩ else ﻩ ﻩﻩ
ﻩﻩﻩﻩﻩ{ﻩ
ﻩ switch(k)
ﻩ ﻩﻩﻩ{
ﻩﻩ case 1:St[top]->lchild=p;break;
ﻩﻩ ﻩﻩcase 2:St[top]->rchild=p;break;
ﻩﻩﻩ ﻩﻩ}
ﻩ ﻩﻩ}
ﻩ }
j++;
ﻩch=str[j];
}
}
void DispBTNode(BTNode *b)
{
ﻩif (b!=NULL)
ﻩ{
ﻩﻩprintf("%c",b->data);
ﻩ if (b->lchild!=NULL || b->rchild!=NULL)
ﻩ {
ﻩ printf("(");
ﻩDispBTNode(b->lchild);
if (b->rchild!=NULL) printf(",");
ﻩﻩDispBTNode(b->rchild);
ﻩﻩprintf(")");
ﻩ }
ﻩ}
}
void PreOrder(BTNode *b)
{
ﻩif (b!=NULL)
{ﻩ
ﻩprintf("%c ",b->data);
PreOrder(b->lchild);
ﻩﻩPreOrder(b->rchild);
}
}
void PreOrder1(BTNode *b)
{
BTNode *St[MaxSize],*p;
int top=-1;
if (b!=NULL)
{
top++; ﻩﻩﻩ
St[top]=b;
while (top>-1)
{
p=St[top];ﻩ
top--;
printf("%c ",p->data);
if (p->rchild!=NULL)
ﻩﻩﻩ{
top++;
St[top]=p->rchild;
ﻩ ﻩ}
if (p->lchild!=NULL)
ﻩ {
top++;
St[top]=p->lchild;
ﻩ ﻩ}
ﻩ }
ﻩprintf("\n");
ﻩ}
}
void InOrder(BTNode *b)
{
if (b!=NULL)
{
ﻩﻩInOrder(b->lchild);
ﻩﻩprintf("%c ",b->data);
ﻩ InOrder(b->rchild);ﻩ
}
}
void InOrder1(BTNode *b)
{
ﻩBTNode *St[MaxSize],*p;
int top=-1;
if (b!=NULL)
ﻩ{
ﻩ p=b;
ﻩﻩwhile (top>-1 || p!=NULL)
ﻩ {
ﻩwhile (p!=NULL)
ﻩﻩ{
ﻩ ﻩﻩtop++;
St[top]=p;
ﻩﻩp=p->lchild;
ﻩ }
ﻩﻩ if (top>-1)
ﻩ {
ﻩﻩﻩﻩp=St[top];
ﻩtop--;
ﻩprintf("%c ",p->data);
ﻩ ﻩﻩp=p->rchild;
ﻩﻩ}
ﻩ }
ﻩprintf("\n");
}
}
void PostOrder(BTNode *b)
{
ﻩif (b!=NULL)
{ﻩ
ﻩPostOrder(b->lchild);
ﻩ PostOrder(b->rchild);
ﻩ printf("%c ",b->data);
ﻩ
ﻩ
ﻩ}
}
void PostOrder1(BTNode *b)
{
BTNode *St[MaxSize];
BTNode *p;
ﻩint flag,top=-1; ﻩ ﻩ
ﻩif (b!=NULL)
ﻩ{
ﻩ do
ﻩ{
ﻩﻩﻩwhile (b!=NULL)
ﻩ {
ﻩtop++;
ﻩﻩﻩﻩSt[top]=b;
ﻩ b=b->lchild;
}
ﻩ p=NULL; ﻩﻩﻩ
ﻩ flag=1;ﻩ ﻩ ﻩﻩ
ﻩﻩwhile (top!=-1 && flag)
ﻩ ﻩ{
ﻩb=St[top];ﻩﻩﻩﻩﻩ
ﻩ ﻩif (b->rchild==p)
ﻩ ﻩ{
ﻩﻩ ﻩ printf("%c ",b->data);
ﻩ ﻩﻩtop--;
ﻩ ﻩ p=b;
ﻩ}
ﻩ ﻩ else
ﻩﻩ {
ﻩ b=b->rchild;ﻩ
ﻩﻩ ﻩﻩflag=0; ﻩﻩ
ﻩﻩ }
ﻩﻩ }
ﻩﻩ} while (top!=-1);
ﻩﻩprintf("\n");
}
}
void LevelOrder(BTNode *b)
{ BTNode *p;
BTNode *qu[MaxSize];ﻩﻩﻩ
ﻩint front,rear; ﻩﻩﻩﻩ
ﻩfront=rear=-1;ﻩ
rear++; ﻩ ﻩﻩﻩ
qu[rear]=b;
while (front!=rear)ﻩﻩ
{ front=(front+1)%MaxSize;
ﻩp=qu[front];
ﻩ printf("%c ",p->data);ﻩ ﻩﻩﻩ
ﻩif (p->lchild!=NULL)
ﻩﻩ{ rear=(rear+1)%MaxSize;
ﻩﻩ qu[rear]=p->lchild;
ﻩﻩ}
if (p->rchild!=NULL)
ﻩ{ rear=(rear+1)%MaxSize;
ﻩﻩqu[rear]=p->rchild;
}
ﻩ}
}
void main()
{
ﻩBTNode *b;
ﻩCreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
printf("二叉树b:");DispBTNode(b);printf("\n");
ﻩprintf("先序遍历序列:\n");
printf("递归算法:");PreOrder(b);printf("\n");
ﻩprintf("非递归算法:");PreOrder1(b);
ﻩprintf("中序遍历序列:\n");
ﻩprintf("递归算法:");InOrder(b);printf("\n");
printf("非递归算法:");InOrder1(b);
ﻩprintf("后序遍历序列:\n");
printf("递归算法:");PostOrder(b);printf("\n");
printf("非递归算法:");PostOrder1(b);
ﻩprintf("层次遍历序列:");LevelOrder(b);printf("\n");
}
注:空间不够,可以增加页码。
展开阅读全文