【数据结构】实验八:树

实验八 树

一、实验目的与要求

1)理解树的定义;

2)掌握树的存储方式及基于存储结构的基本操作实现;

二、 实验内容

题目一:采用树的双亲表示法根据输入实现以下树的存储,并实现输入给定结点的双亲结点的查找。

双亲表示法的存储结构描述如下

#define MaxSize 100  //树中最多结点数

typedef struct{  //树的结点定义

    char data;  //数据元素

    int parent;  //双亲位置域

}PTNode;

typedef struct{  //树的类型定义

    PTNode nodes[MaxSize];  //双亲表示

    int n;  //结点数

}PTree;

【数据结构】实验八:树_第1张图片

提示:一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示其双亲结点在数组中的位置。根结点的下标为0,其伪指针域为-1。

示列:

 【数据结构】实验八:树_第2张图片

 

题目二:采用树的孩子表示法,实现以上树的存储,要求实现输入结点查找输出该结点的所有孩子结点,没有孩子结点输出-1。(选做)

存储结构描述

#define MaxSize 100

typedef struct ChildNode{ //链表中每个结点的定义

    //链表中每个结点存储的不是数据本身,而是数据在数组中存储的位置下标

    int child;

    struct ChildNode *next;

}ChildNode;

typedef struct{  //树中每个结点的定义

    char data;  //结点的数据类型

    ChildNode *firstchild;  //孩子链表头指针

}CHNode;

typedef struct{

    CHNode nodes[MaxSize];  //存储结点的数组

    int n;

}CTree;

示列:

【数据结构】实验八:树_第3张图片

【数据结构】实验八:树_第4张图片

三、实验结果

1)请将调试通过的运行结果截图粘贴在下面,并说明测试用例和运行过程。

2)请将源代码cpp文件和实验报告一起压缩上传。


第一题:

运行结果:

【数据结构】实验八:树_第5张图片

 

测试用例和运行过程:

如第一题A图和B图所示,测试用例为该树,各个结点对应的dataparent分别为{ (R,-1) , (A,0) , (B,0) , (C,0) , (D,1) , (E,1) , (F,3) , (G,6) , (H,6) , (K,6) }  

主函数首先创建一个树,通过构造树函数CreateTree依次录入结点的值及其双亲位于数组中的位置下标,再输入需要查询的结点值,通过查找结点函数SearchNode中的for循环遍历各个结点,当且仅当结点值匹配时,输出其父结点和存储位置,然后跳出循环。

最终结果如运行截图所示。

实验代码:

#include 
#include 
using namespace std;

#define MaxSize 100  //树中最多结点数
typedef struct{  //树的结点定义
    char data;  //数据元素
    int parent;  //双亲位置域
}PTNode;

typedef struct{  //树的类型定义
    PTNode nodes[MaxSize];  //双亲表示
    int n;  //结点数
}PTree;

//构造树 
void CreateTree(PTree *T){
	int i=0;
	cout<<"请输入结点个数:"<>T->n ;
	cout<<"请输入结点的值及其双亲位于数组中的位置下标:"<n ;i++){ 
		cin>>T->nodes[i].data>>T->nodes[i].parent ;
	}
	return;
}

//查找结点信息 
void SearchNode(PTree *T,char e){
	int i=0,flag=0;
	for( ;in ;i++){
		if(T->nodes[i].data ==e){
			flag=1;
			cout<nodes[T->nodes[i].parent].data<nodes[i].parent <>element;
	SearchNode(&T,element);
	return 0;
}

第二题:

运行结果:

【数据结构】实验八:树_第6张图片

 

测试用例和运行过程:

如第二题的图所示,测试用例为该树,只有RACF结点具有孩子结点,其余均为叶子结点。

主函数首先创建一个树,通过构造树函数CreateTree,首先录入结点的总数,再通过外层for循环依次输入每一个结点的值、当前结点的孩子结点数量,紧接着通过内层for循环依次输入当前结点的孩子结点在顺序表中存储的位置,最终完成树的创建。然后通过查找孩子结点函数SearchChild,输入要查找其孩子结点的结点,通过for循环查找元素一致的结点,确定之后判断孩子是否为空,若非空则通过while循环输出每一个非空的孩子结点。

最终结果如运行截图所示。

实验代码:

#include 
#include 
#include 
using namespace std;

#define MaxSize 100
typedef struct ChildNode{ //链表中每个结点的定义
    //链表中每个结点存储的不是数据本身,而是数据在数组中存储的位置下标
    int child;
    struct ChildNode *next;
}ChildNode;
 
typedef struct{  //树中每个结点的定义
    char data;  //结点的数据类型
    ChildNode *firstchild;  //孩子链表头指针
}CHNode;
 
typedef struct{
    CHNode nodes[MaxSize];  //存储结点的数组
    int n;
}CTree;

//实现输入结点查找输出该结点的所有孩子结点,没有孩子结点输出-1

//创建树 
void CreateTree(CTree *T){
	cout<<"请输入结点总数:";
	cin>>T->n;
	int i=0;
	for( ;in;i++){
		cout<<"请输入第"<>T->nodes[i].data;
		cout<<"请输入该结点的孩子结点数量:";
		int num;
		cin>>num;
		ChildNode *m=NULL;
		int j=0;
		for( ;j>s->child;
			s->next = NULL;
			if(j==0){
				T->nodes[i].firstchild = s;
				m=s;
			}
			else{
				m->next = s;
				m=s;
			}
		}
	}
}

//查找孩子结点 
void SearchChild(CTree *T){
	char e;
	cout<<"请输入要查找其孩子结点的结点:";
	cin>>e;
	int flag=-1,i=0;
	for( ;in ;i++){
		if(T->nodes[i].data == e){
			flag=i;
			break;
		}
	} 
	if(flag==-1){
		cout<<"Not Found"<nodes[flag].firstchild;
	if(p==NULL){
		cout<<"此结点为叶子结点"<nodes[p->child].data<<" ";
		p=p->next;
	}
}

int main(){
	CTree T;
	int i=0;
	CreateTree(&T);
	SearchChild(&T);
	return 0;
}

其他:

#include
using namespace std;

#define MaxSize 100  //树中最多结点数

typedef struct{  //树的结点定义
    char data;  //数据元素
    int parent;  //双亲位置域
}PTNode;

typedef struct{  //树的类型定义
    PTNode nodes[MaxSize];  //双亲表示
    int n;  //结点数
}PTree;

void Parent_PT(PTree &ptree,char m){
	int i;
	for(i=0;(i=ptree.n) 	cout<<"Node -"<>num;
	ptree.n=num;
	cout<<"请输入结点的值以及双亲位于数组中的位置下标:"<>m;cin>>q;
		ptree.nodes[i].data=m;
        ptree.nodes[i].parent=q;
	}
	while(1){
    	cout<<"请输入要查询的结点值:";
    	cin>>m;
    	if(m=='#'){
    		cout<<"查询结束!";
			break; 
		} 
    	Parent_PT(ptree,m);	
	} 
	return 0;
} 

#include
using namespace std;

#define MaxSize 100

typedef struct ChildNode{ //链表中每个结点的定义
    //链表中每个结点存储的不是数据本身,而是数据在数组中存储的位置下标
    int child;
    struct ChildNode *next;
}ChildNode;

typedef struct{  //树中每个结点的定义
    char data;  //结点的数据类型
    ChildNode *firstchild;  //孩子链表头指针
}CHNode;

typedef struct{
    CHNode nodes[MaxSize];  //存储结点的数组
    int n;
}CTree;

void Init_tree(CTree &ctree){
	cout<<"请输入结点总数:";
	int num;cin>>num;
	ctree.n=num;
	for(int i=0;i>m;
		ctree.nodes[i].data=m;
		ctree.nodes[i].firstchild=NULL;
		cout<<"请输入结点"<>cnum;
		if(cnum==0) continue;
		cout<<"请输入第1个孩子结点在顺序表中的存储位置:";
		int l;cin>>l;
		ChildNode *p=new ChildNode;
		p->child=l;
		p->next=NULL;
		ctree.nodes[i].firstchild=p;
		for(int j=1;j>l;
			ChildNode *q=new ChildNode;
			q->child=l;
			q->next=NULL;
			p->next=q;
			p=q;
		}
	}
}

void Children(CTree &ctree,char f){
	int j;
	for(j=0;(j=ctree.n) cout<<"Node -"<child].data<<" ";
			while(p->next!=NULL){
				p=p->next;
		    	cout<child].data<<" ";
			}
		}
	}
}

void Destroy(CTree &ctree){
	for(int i=0;inext;
			q->next=NULL;
			delete q;
		}
		ctree.nodes[i].firstchild=NULL;
	}
} 

int main(){
	CTree ctree;
	Init_tree(ctree);//初始化 
	while(1){
		cout<<"--------------------------------------"<>f;
    	if(f=='#'){
    		cout<<"查询结束!";
			break; 
		} 
    	Children(ctree,f);	
    	cout<

你可能感兴趣的:(数据结构,数据结构)