太原理工数据结构实验报告 实验二 树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告
课程名称:数据结构B
实验项目:树
实验地点:实验楼110
专业班级:计科1301班学号:2013001989 学生姓名:杨喆
指导教师:孟亮
2015年1 月1 日
一、实验目的和要求
熟悉树的各种表示方法和各种遍历方式,掌握有关算法的实现,了解树在计算机科学及其它工程技术中的应用。
二、实验内容和原理
1.编写递归算法,计算二叉树中叶子结点的数目。
2.编写递归算法,在二叉树中求位于先序序列中第K个位置的结点。
3.将上述例题用非递归程序实现。
三、主要仪器设备
1.设备: PC微机;
2.实验环境: windows操作系统;VC++6.0,
四、实验结果与分析(必填)
(1)程序代码:
实验2_1,2_2:
#include "stdio.h"
#include "malloc.h"
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define NULL 0
int n=0;
typedef char TElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
Status CreateBiTree(BiTree &T) // 递归创建一棵树
{
char ch;
ch = getchar(); // need input '12##3##'
if (ch=='#') T=NULL;
else
{
if (!(T=(BiTNode *) malloc(sizeof (BiTNode))))
return (OVERFLOW); //**********————————为什么要加括号
T->data = ch ;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
return OK; }//CreateBiTree
Status PreOrderTraverse(BiTree T,int &n)
{
if (T)
{
printf(" %c",T->data);
n++;
if (PreOrderTraverse(T->lchild,n))
{
if(T->data)
if(PreOrderTraverse(T->rchild,n))
{
return OK;
}
}
//if (InOrderTraverse(T->lchild,Visit))
// if (Visit(T->data))
// if (InOrderTraverse(T->rchild,Visit))
// return OK;
return ERROR;
}else
return OK;
}//PreOrderTraverse
void CountLeaf(BiTree T, int& count) //实验一{
if (T)
{
//if (( !T->lchild) || (!T->rchild))
count++; // 对叶子结点及数
CountLeaf(T->lchild, count);
CountLeaf(T->rchild, count);
} // CountLeaf
}
Status Find_k_Node(BiTree T, int k,int &i) //实验二{
if(T)
{
i++;
if(i == k)
printf("您得到的结点为%c",T->data);
Find_k_Node(T->lchild,k,i);
Find_k_Node(T->rchild,k,i);
}
return OK;
}
Status menu_select()
{
int sn;
for(;;)
{
printf("\n请输入您要进行的功能选项");
scanf("%d",&sn);
getchar();
if(sn<1||sn>4)
printf("\n\t输入错误,请重新输入\n");
else
break;
}
return sn;
}
void main()
{
int n=0,k,i;
BiTree T;
printf("1.创建一棵树并输出;\n2.统计结点数(递归算法);\n3.获取输入节点所在的位置(递归算法);\n4.结束;\n");
while(1)
{
switch(menu_select())
{
case 1:
printf("\n创建一棵树,按先序遍历一次输完所有结点,空结点输入#\n");
CreateBiTree(T);
getchar();
PreOrderTraverse(T,n);
printf("\n");
break;
case 2:
n=0;
CountLeaf(T,n);
printf("该树的结点数量为: %d\n",n);
printf("\n");
break;
case 3:
printf("请输入你您获取的结点位置:k=");
scanf("%d",&k);
i = 0;
Find_k_Node(T,k,i);
printf("\n\n");
break;
case 4:
printf("\nend\n");
return;
}
}
}
实验2_3:
#include
#include
#include
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define NULL 0
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef char TElemType;
typedef char SElemType;
typedef int Status;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild; //左右孩子指针