【数据结构】实验八:树

实验八 树

一、实验目的与要求

1)理解树的定义;

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

二、 实验内容

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

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

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

typedef struct{  //树的结点定义

    char data;  //数据元素

    int parent;  //双亲位置域

}PTNode;

typedef struct{  //树的类型定义

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

    int n;  //结点数

}PTree;

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

示列:

 

 

题目二:采用树的孩子表示法,实现以上树的存储,要求实现输入结点查找输出该结点的所有孩子结点,没有孩子结点输出-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;

示列:

三、实验结果

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

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


第一题:

运行结果:

 

测试用例和运行过程:

如第一题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 <iostream>
#include <cstdio>
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<<"请输入结点个数:"<<endl;cin>>T->n ;cout<<"请输入结点的值及其双亲位于数组中的位置下标:"<<endl;for( ;i<T->n ;i++){ cin>>T->nodes[i].data>>T->nodes[i].parent ;}return;
}//查找结点信息 
void SearchNode(PTree *T,char e){int i=0,flag=0;for( ;i<T->n ;i++){if(T->nodes[i].data ==e){flag=1;cout<<e<<"的父结点为:"<<T->nodes[T->nodes[i].parent].data<<endl;cout<<"存储位置为:"<<T->nodes[i].parent <<endl;break;}}if(flag==0){cout<<"NOT FOUND"<<endl;}
}int main(){PTree T;CreateTree(&T);cout<<"请输入要查询的结点值:";char element;cin>>element;SearchNode(&T,element);return 0;
}

第二题:

运行结果:

 

测试用例和运行过程:

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

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

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

实验代码:

#include <iostream>
#include <cstdio>
#include <malloc.h>
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( ;i<T->n;i++){cout<<"请输入第"<<i+1<<"个结点的值:";cin>>T->nodes[i].data;cout<<"请输入该结点的孩子结点数量:";int num;cin>>num;ChildNode *m=NULL;int j=0;for( ;j<num;j++){ChildNode *s=(ChildNode *)malloc(sizeof(ChildNode)); cout<<"请输入第"<<j+1<<"个孩子结点在顺序表中的存储位置:";cin>>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( ;i<T->n ;i++){if(T->nodes[i].data == e){flag=i;break;}} if(flag==-1){cout<<"Not Found"<<endl;return;}ChildNode *p=T->nodes[flag].firstchild;if(p==NULL){cout<<"此结点为叶子结点"<<endl;return;}cout<<e<<"的所有孩子结点为:";while(p!=NULL){cout<<T->nodes[p->child].data<<" ";p=p->next;}
}int main(){CTree T;int i=0;CreateTree(&T);SearchChild(&T);return 0;
}

其他:

#include<iostream>
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)&&(ptree.nodes[i].data!=m);i++);if(i>=ptree.n) 	cout<<"Node -"<<m<<" is not exist!"<<endl;else{int j=ptree.nodes[i].parent;if(j==-1)cout<<"Node -"<<m<<" has not parent!"<<endl;else{cout<<m<<"的父结点为:"<<ptree.nodes[j].data<<endl;cout<<ptree.nodes[j].data<<"的储存位置为:"<<j<<endl;}}
}int main(){PTree ptree;cout<<"请输入结点个数:";int num;cin>>num;ptree.n=num;cout<<"请输入结点的值以及双亲位于数组中的位置下标:"<<endl;char m;int q; for(int i=0;i<num;i++){cin>>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<iostream>
using namespace std;#define MaxSize 100typedef 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<num;i++){cout<<"请输入第"<<i+1<<"个结点的值:";char m;cin>>m;ctree.nodes[i].data=m;ctree.nodes[i].firstchild=NULL;cout<<"请输入结点"<<m<<"的孩子结点数:";int cnum;cin>>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<cnum;j++){cout<<"请输入第"<<j+1<<"孩子结点在顺序表中的存储位置:";cin>>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)&&(ctree.nodes[j].data!=f);j++);if(j>=ctree.n) cout<<"Node -"<<f<<" is not exist!";else{ChildNode *p=ctree.nodes[j].firstchild;if(!p) cout<<"Node -"<<f<<" has not children!";else{cout<<f<<"的所有孩子结点为: ";cout<<ctree.nodes[p->child].data<<" ";while(p->next!=NULL){p=p->next;cout<<ctree.nodes[p->child].data<<" ";}}}
}void Destroy(CTree &ctree){for(int i=0;i<ctree.n;i++){ChildNode *p=ctree.nodes[i].firstchild;ChildNode *q;if(!p) continue;while(p){q=p;p=p->next;q->next=NULL;delete q;}ctree.nodes[i].firstchild=NULL;}
} int main(){CTree ctree;Init_tree(ctree);//初始化 while(1){cout<<"--------------------------------------"<<endl;cout<<"请输入要查找其孩子结点的结点:"; char f;cin>>f;if(f=='#'){cout<<"查询结束!";break; } Children(ctree,f);	cout<<endl;}Destroy(ctree);//释放new出的空间 return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/11053.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于罪名法务智能知识图谱(含码源):基于280万罪名预测、20W法务问答与法律资讯问答功能

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

如何构建适合自己的DevOps软件测试改进方案

​目录 DevOps成熟度模型分析 构建适合企业自身性能的测试过程改进框架 资料获取方法 根据2022年的DevOps全球调查报告显示&#xff0c;主流软件企业采用或部分采用DevOps且已获得良好成效的占比已达70%&#xff0c;DevOps俨然成为当下软件开发研究的重要方向。 测试作为软…

如何使用 PHP 删除数据?

当你想要从数据库中删除数据时&#xff0c;PHP可以帮你实现这个功能。以下是一些简单的步骤和代码示例&#xff0c;帮助你从新手的角度用幽默的语气回答如何使用PHP删除数据。 首先&#xff0c;你需要连接到数据库。这可以通过使用PHP中的mysqli_connect函数来实现。以下是连接…

uni-app 微信小程序:启用组件按需注入

uni-app 微信小程序&#xff1a;启用组件按需注入 文章目录 uni-app 微信小程序&#xff1a;启用组件按需注入一、官方文档按需注入注意事项 二、HBuilder X 设置三、效果 一、官方文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ability/lazyload.html 按…

kotlin异常处理try-catch-finally

kotlin异常处理try-catch-finally fun main(args: Array<String>) {try {println("a")} catch (e: Exception) {//异常捕获println("a-catch: $e")} finally {//善后&#xff0c;无论是否异常&#xff0c;都会执行println("a-finally")}t…

内存泄漏是什么?有什么危害

内存泄漏是什么&#xff1f;有什么危害 1. 前言1.内存泄漏是什么&#xff1f;2. 为什么会发生内存泄漏3. 内存泄漏的危害4. 总结 1. 前言 在各种项目开发中&#xff0c;内存泄漏是一个很严重的问题。对资源管理、性能优越、系统稳定性&#xff0c;以及是否安全产生极大印象。本…

CCD光斑图像质量分析仪的作用和工作原理

激光光斑的成型在激光加工中起着至关重要的作用&#xff0c;在实际加工中激光可以被变换成各种形状以满足加工需求&#xff0c;激光光斑的形状大致可以被分为四种&#xff1a;矩形、环形、椭圆形、线形。矩形的激光光斑适用于激光切割、激光焊接&#xff0c;环形的激光光斑适用…

odoo16-python框架-动作

总结 1 模型和视图的 设计之美 view_ids, view_id,view_mode 最终目的都是为了生成views, 也就是视图. 模型是死的,像男人,一成不变 视图像女人,千变万化, 姿态万千 一阴一阳之谓道,设计之美又在这里得到了体现 2 所有的动作都可以通过web界面来配置 可以通过在"设…

【Python入门系列】第十八篇:Python自然语言处理和文本挖掘

文章目录 前言一、Python常用的NLP和文本挖掘库二、Python自然语言处理和文本挖掘1、文本预处理和词频统计2、文本分类3、命名实体识别4、情感分析5、词性标注6、文本相似度计算 总结 前言 Python自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&…

慕课网Go-3.函数、defer、panic、recover、结构体、指针、interface

函数 package mainimport "fmt"func add(a int, b int) (int, error) {return a b, nil }func add2(a int, b int) (sum int, err error) {sum a berr nilreturn sum, err }// 参数数量任意 func add3(items ...int) (sum int) {for _, value : range items {su…

注解和反射02--Java反射

反射 动态和静态语言获取反射对象Java反射机制提供的功能Java反射优缺点反射相关的主要API 动态和静态语言 要学习反射&#xff0c;首先我们需要了解一下静态和动态语言。 动态语言&#xff1a;是一类在运行时可以改变其结构的语言&#xff1a;例如新的函数、对象、甚至代码可…

Tomcat调优1

Tomcat调优的具体应用场景和案例可以考虑这些方面: 高并发场景 增加最大线程数,推荐设置为200-500左右。 优化线程池参数,增大工作队列容量防止请求排队。 使用NIO连接器,提高连接处理效率。 适当增大最大连接数,根据硬件设定为2000-4000。 大流量场景 适当调大Tomcat及J…

C语言习题练习

C语言习题练习 一、offsetof宏二、交换奇偶位三、原地移除数组总结 一、offsetof宏 首先我们要了解什么是offsetof宏&#xff1a; . 此具有函数形式的宏返回数据结构或联合类型中成员成员的偏移值&#xff08;以字节为单位&#xff09;。 . 返回的值是size_t类型的无符号整数…

Is Mapping Necessary for Realistic PointGoal Navigation 论文阅读和代码分析

论文 论文信息 题目&#xff1a;Is Mapping Necessary for Realistic PointGoal Navigation? 作者&#xff1a;Ruslan Partsey、 Erik Wijmans 代码地址&#xff1a;rpartsey.github.io/pointgoalnav 来源&#xff1a;CVPR Abstract 目标&#xff1a;证明显式地图不是成功…

【数据结构】实验九:二叉树

实验九 二叉树 一、实验目的与要求 1&#xff09;理解二叉树的类型定义&#xff1b; 2&#xff09;掌握二叉树的存储方式及基于存储结构的基本操作实现&#xff1b; 二、 实验内容 1. 二叉树的结点定义如下&#xff1a; struct TreeNode { int m_nvalue; TreeNode* m_…

多源BFS-- 矩阵距离

关于多源BFS&#xff0c;基本上就是单源BFS的简单升级了一下&#xff0c;比如在queue中队头开始时只有一个&#xff0c;我们通过这一个队头去推导其他的东西。而多源最短路就是队头一开始有1-n个可能的数&#xff0c;一个一个去BFS。 题目思路&#xff1a; 这个题就直接把所有的…

分享69个Java源码,总有一款适合您

Java源码 分享69个Java源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c;大家下载后可以看到。 源码下载链接&#xff1a; https://pan.baidu.com/s/1ZgbJhMNwIyFyqFzHsDdL5w 提取码&a…

excel添加列匹配对比及标签生成(留存)

import pandas as pd import numpy as np import os from datetime import date,datetime todaydate.today()downpath/Users/kangyongqing/Downloads/ gensuipath/Users/kangyongqing/Documents/kangyq/202209/OKR预占/2023Q2促留存/月度留存分级/24样本学生跟随.xlsxdownname1…

WPF实战学习笔记17-TodoView 添加新增、编辑、查询功能

文章目录 TodoView 添加新增、编辑、查询功能修改TodoViewModel.cs修改XAML修改ToDoService TodoView 添加新增、编辑、查询功能 修改TodoViewModel.cs using Mytodo.Common.Models; using Mytodo.Service; using Prism.Commands; using Prism.Ioc; using Prism.Mvvm; using …

WebSocket心跳机制(笔记大全)

一、WebSocket心跳机制前端 前端实现WebSocket心跳机制的方式主要有两种&#xff1a; 使用setInterval定时发送心跳包。在前端监听到WebSocket的onclose()事件时&#xff0c;重新创建WebSocket连接。 第一种方式会对服务器造成很大的压力&#xff0c;因为即使WebSocket连接正…