实验三树和二叉树
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
printf("\n");
DisplayBinTree(T);
printf("前序遍历:\n");
Preorder(T);
printf("\n");
printf("中序遍历:\n");
Inorder(T);
printf("\n");
printf("后序遍历:\n");
Postorder(T);
printf("\n");
二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
三、源程序及注释:
#include <stdio.h>
#include <stdlib.h>
//二叉树的链式存储表示
typedef char DataType;//应由用户定义DataType的实际类型
2.用广义表表示所建二叉树。
3.用凹入表表示所建二叉树。
4.分别利用前序遍历、中序遍历、后序遍历所建二叉树。
5.求二叉树结点总数,观察输出结果。
6.求二叉树叶子总数,观察输出结果。
7.交换各结点的左右子树,用广义表表示法显示新的二叉树。
8.(★)二叉树采用链接存储结构,其根结点指针为T,设计一个算法对这棵二叉树的每个结点赋值:(注意要修改DataType类型)
t->data=T->data;
t1=swap(T->lchild);
t2=swap(T->rchild);
t->lchild=t2;
t->rchild=t1;
}
return(t);
}
四、运行输出结果:
五、调试和运行程序过程中产生的问题及采取的措施:
六、对算法的程序的讨论、分析,改进设想,其它经验教训:
if ((ch=getchar())==' ')
*T=NULL;
else
{/*读入非空格*/
*T=(BinTNode *)malloc(sizeof(BinTNode));/*生成结点*/
(*T)->data=ch;
CreateBinTree(&(*T)->lchild );/*构造左子树*/
CreateBinTree(&(*T)->rchild );/*构造右子树*/
{
if(T==NULL)//为空树返回
return;
if(T->lchild!=NULL)//如果左子树不为空则中序遍历左子树
Inorder(T->lchild);
printf("%c",T->data);//输出结点
if(T->rchild!=NULL)//如果右子树为空则中序遍历右子树
Inorder(T->rchild);
{
if(T==NULL)
return;
printf("%c",T->data);
if(T->lchild!=NULL)
Preorder(T->lchild);
if(T->rchild!=NULL)
Preorder(T->rchild);
}
//中序遍历二叉树
void Inorder(BinTree T)
if (T->rchild!=NULL)
printf(",");
ListBinTree(T->rchild);
printf(")");
}源自文库
}
}
/*用凹入表表示二叉树*/
void DisplayBinTree(BinTree T)
{
BinTree stack[100],p;
int level[100],top,n,i;
Postorder(T->rchild);
printf("%c",T->data);//输出结点
}
//计算总结点数
int nodes(BinTree T)
{
int num1,num2;
if(T==NULL) return(0);
else if (T->lchild==NULL && T->rchild==NULL) return(1);
叶结点的值为3
只有左孩子或右孩子的结点则其值分别等于左孩子或右孩子的值
左、右孩子均有的结点,则其值等于左、右孩子结点的值之和
用广义表表示法显示所建二叉树
阅读理解建立Huffman树的算法,对该算法进行运行及调试。具体实现要求:
1.调试并运行Huffman算法,验算《回家作业六》的第3题。
2.(★)求Huffman树的带权路径长度WPL。
int nodes(BinTree T);//计算总结点数
int leafs(BinTree T);//计算总叶子数
BinTree swap(BinTree T);//交换左右子树
BinTree T;
printf("请输入先序序列(虚结点用空格表示):\n");
CreateBinTree(&T);
ListBinTree(T);
typedef struct node
{DataType data;
struct node *lchild, *rchild;//左右孩子指针
} BinTNode;//结点类型
typedef BinTNode *BinTree;
void main()
{
void ListBinTree(BinTree T);//用广义表表示二叉树
七、对实验方式、组织、设备、题目的意见和建议:
top--;
if (p->rchild!=NULL)
{
top++;
stack[top]=p->rchild;
level[top]=n+3;
}
if (p->lchild!=NULL)
{
top++;
stack[top]=p->lchild;
level[top]=n+3;
}
}
}
}
//前序遍历二叉树
void Preorder(BinTree T)
printf("二叉树的总结点数为%d\n",nodes(T));
printf("二叉树的总叶子结点数为%d\n",leafs(T));
T=swap(T);
ListBinTree(T);
printf("\n");
}
/*构造二叉链表*/
void CreateBinTree(BinTree *T)
{
char ch;
《数据结构》实验报告三
学院:
班级:
学号:
姓名:
日期:2010.04.29
程序名:L61.CPP,L62.CPP
一、上机实验的问题和要求:
要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。具体实现要求:
1.基于先序遍历的构造算法:输入是二叉树的先序序列,但必须在其中加入虚结点以示空指针的位置。假设虚结点输入时用空格字符表示。
void DisplayBinTree(BinTree T);//用凹入表表示二叉树
void CreateBinTree(BinTree *T);//构造二叉链表
void Preorder(BinTree T);//前序遍历二叉树
void Inorder(BinTree T);//中序遍历二叉树
void Postorder(BinTree T);//后序遍历二叉树
else
{
num1=nodes(T->lchild);
num2=nodes(T->rchild);
return(num1+num2+1);
}
}
//计算总叶子数
int leafs(BinTree T)
{
int num1,num2;
if(T==NULL) return(0);
else if (T->lchild==NULL && T->rchild==NULL) return(1);
if (T!=NULL)
{
printf("用凹入表表示二叉树:\n");
top=1;
stack[top]=T;
level[top]=3;
while(top>0)
{
p=stack[top];
n=level[top];
for (i=1;i<=n; i++)
printf(" ");
printf("%c\n",p->data);
else
{
num1=leafs(T->lchild);
num2=leafs(T->rchild);
return(num1+num2);
}
}
//交换左右子树
BinTree swap(BinTree T)
{
BinTree t,t1,t2;
if (T==NULL) t=NULL;
else
{
t=(BinTree)malloc(sizeof(BinTNode));
}
}
/*用广义表表示二叉树*/
void ListBinTree(BinTree T)
{
if (T!=NULL)
{
printf("%c",T->data);
if (T->lchild!=NULL||T->rchild!=NULL)
{
printf("(");
ListBinTree(T->lchild);
}
//后序遍历二叉树
void Postorder(BinTree T)//T为搜索指针
{
if(T==NULL)//为空树返回
return;
if(T->lchild!=NULL)//如果左子树不为空,则后序遍历左子树
Postorder(T->lchild);
if(T->rchild!=NULL)//如果右子树不为空,则后序遍历右子树
DisplayBinTree(T);
printf("前序遍历:\n");
Preorder(T);
printf("\n");
printf("中序遍历:\n");
Inorder(T);
printf("\n");
printf("后序遍历:\n");
Postorder(T);
printf("\n");
二、程序设计的基本思想,原理和算法描述:
(包括程序的结构,数据结构,输入/输出设计,符号名说明等)
三、源程序及注释:
#include <stdio.h>
#include <stdlib.h>
//二叉树的链式存储表示
typedef char DataType;//应由用户定义DataType的实际类型
2.用广义表表示所建二叉树。
3.用凹入表表示所建二叉树。
4.分别利用前序遍历、中序遍历、后序遍历所建二叉树。
5.求二叉树结点总数,观察输出结果。
6.求二叉树叶子总数,观察输出结果。
7.交换各结点的左右子树,用广义表表示法显示新的二叉树。
8.(★)二叉树采用链接存储结构,其根结点指针为T,设计一个算法对这棵二叉树的每个结点赋值:(注意要修改DataType类型)
t->data=T->data;
t1=swap(T->lchild);
t2=swap(T->rchild);
t->lchild=t2;
t->rchild=t1;
}
return(t);
}
四、运行输出结果:
五、调试和运行程序过程中产生的问题及采取的措施:
六、对算法的程序的讨论、分析,改进设想,其它经验教训:
if ((ch=getchar())==' ')
*T=NULL;
else
{/*读入非空格*/
*T=(BinTNode *)malloc(sizeof(BinTNode));/*生成结点*/
(*T)->data=ch;
CreateBinTree(&(*T)->lchild );/*构造左子树*/
CreateBinTree(&(*T)->rchild );/*构造右子树*/
{
if(T==NULL)//为空树返回
return;
if(T->lchild!=NULL)//如果左子树不为空则中序遍历左子树
Inorder(T->lchild);
printf("%c",T->data);//输出结点
if(T->rchild!=NULL)//如果右子树为空则中序遍历右子树
Inorder(T->rchild);
{
if(T==NULL)
return;
printf("%c",T->data);
if(T->lchild!=NULL)
Preorder(T->lchild);
if(T->rchild!=NULL)
Preorder(T->rchild);
}
//中序遍历二叉树
void Inorder(BinTree T)
if (T->rchild!=NULL)
printf(",");
ListBinTree(T->rchild);
printf(")");
}源自文库
}
}
/*用凹入表表示二叉树*/
void DisplayBinTree(BinTree T)
{
BinTree stack[100],p;
int level[100],top,n,i;
Postorder(T->rchild);
printf("%c",T->data);//输出结点
}
//计算总结点数
int nodes(BinTree T)
{
int num1,num2;
if(T==NULL) return(0);
else if (T->lchild==NULL && T->rchild==NULL) return(1);
叶结点的值为3
只有左孩子或右孩子的结点则其值分别等于左孩子或右孩子的值
左、右孩子均有的结点,则其值等于左、右孩子结点的值之和
用广义表表示法显示所建二叉树
阅读理解建立Huffman树的算法,对该算法进行运行及调试。具体实现要求:
1.调试并运行Huffman算法,验算《回家作业六》的第3题。
2.(★)求Huffman树的带权路径长度WPL。
int nodes(BinTree T);//计算总结点数
int leafs(BinTree T);//计算总叶子数
BinTree swap(BinTree T);//交换左右子树
BinTree T;
printf("请输入先序序列(虚结点用空格表示):\n");
CreateBinTree(&T);
ListBinTree(T);
typedef struct node
{DataType data;
struct node *lchild, *rchild;//左右孩子指针
} BinTNode;//结点类型
typedef BinTNode *BinTree;
void main()
{
void ListBinTree(BinTree T);//用广义表表示二叉树
七、对实验方式、组织、设备、题目的意见和建议:
top--;
if (p->rchild!=NULL)
{
top++;
stack[top]=p->rchild;
level[top]=n+3;
}
if (p->lchild!=NULL)
{
top++;
stack[top]=p->lchild;
level[top]=n+3;
}
}
}
}
//前序遍历二叉树
void Preorder(BinTree T)
printf("二叉树的总结点数为%d\n",nodes(T));
printf("二叉树的总叶子结点数为%d\n",leafs(T));
T=swap(T);
ListBinTree(T);
printf("\n");
}
/*构造二叉链表*/
void CreateBinTree(BinTree *T)
{
char ch;
《数据结构》实验报告三
学院:
班级:
学号:
姓名:
日期:2010.04.29
程序名:L61.CPP,L62.CPP
一、上机实验的问题和要求:
要求采用二叉链表作为存储结构,完成二叉树的建立,前序、中序和后序遍历的操作,求所有叶子及结点总数的操作等。具体实现要求:
1.基于先序遍历的构造算法:输入是二叉树的先序序列,但必须在其中加入虚结点以示空指针的位置。假设虚结点输入时用空格字符表示。
void DisplayBinTree(BinTree T);//用凹入表表示二叉树
void CreateBinTree(BinTree *T);//构造二叉链表
void Preorder(BinTree T);//前序遍历二叉树
void Inorder(BinTree T);//中序遍历二叉树
void Postorder(BinTree T);//后序遍历二叉树
else
{
num1=nodes(T->lchild);
num2=nodes(T->rchild);
return(num1+num2+1);
}
}
//计算总叶子数
int leafs(BinTree T)
{
int num1,num2;
if(T==NULL) return(0);
else if (T->lchild==NULL && T->rchild==NULL) return(1);
if (T!=NULL)
{
printf("用凹入表表示二叉树:\n");
top=1;
stack[top]=T;
level[top]=3;
while(top>0)
{
p=stack[top];
n=level[top];
for (i=1;i<=n; i++)
printf(" ");
printf("%c\n",p->data);
else
{
num1=leafs(T->lchild);
num2=leafs(T->rchild);
return(num1+num2);
}
}
//交换左右子树
BinTree swap(BinTree T)
{
BinTree t,t1,t2;
if (T==NULL) t=NULL;
else
{
t=(BinTree)malloc(sizeof(BinTNode));
}
}
/*用广义表表示二叉树*/
void ListBinTree(BinTree T)
{
if (T!=NULL)
{
printf("%c",T->data);
if (T->lchild!=NULL||T->rchild!=NULL)
{
printf("(");
ListBinTree(T->lchild);
}
//后序遍历二叉树
void Postorder(BinTree T)//T为搜索指针
{
if(T==NULL)//为空树返回
return;
if(T->lchild!=NULL)//如果左子树不为空,则后序遍历左子树
Postorder(T->lchild);
if(T->rchild!=NULL)//如果右子树不为空,则后序遍历右子树