数据结构树的基本操作_数据结构-树的基本操作
#include#include#include"GTree.h"#include"LinkList.h"typedefstruct _tag_GTreeNode GTreeNode; /*树的节点*/
struct_tag_GTreeNode
{
GTreeData* data; /*节点自身数据*/GTreeNode* parent; /*父亲节点*/LinkList* child; /*孩子链表*/};
typedefstruct _tag_TLNode TLNode; /*链表节点结构体,将树节点串成链表*/
struct_tag_TLNode
{
LinkListNode header;
GTreeNode*node;
};static void recursive_display(GTreeNode* node, GTree_Printf* pFunc, int format, int gap, char div)/*递归打印函数 定义为static外界看不到 format--缩进单位个数 gap--缩进单位 div--缩进形式 pFunc--打印函数*/{int i = 0;if( (node != NULL) && (pFunc !=NULL) )
{for(i=0; i
{
printf("%c", div);
}
pFunc(node->data); /*打印数据*/printf("\n");for(i=0; ichild); i++)
{
TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
recursive_display(trNode->node, pFunc, format +gap, gap, div);
}
}
}static void recursive_delete(LinkList* list, GTreeNode* node) /*递归删除函数 要删除该节点的所有函数*/{if( (list != NULL) && (node !=NULL) )
{
GTreeNode* parent = node->parent; /*要删除的节点的父亲节点*/
int index = -1;int i = 0;for(i=0; i
TLNode* trNode = (TLNode*)LinkList_Get(list, i);if( trNode->node ==node )
{
LinkList_Delete(list, i);
free(trNode);
index= i; /*标记位:表面从组织链表中删除成功*/
break;
}
}if( index >= 0)
{if( parent != NULL ) /*从父亲节点的孩子链表中删除该节点*/{for(i=0; ichild); i++)
{
TLNode* trNode = (TLNode*)LinkList_Get(parent->child, i);if( trNode->node ==node )
{
LinkList_Delete(parent->child, i);
free(trNode);break;
}
}
}while( LinkList_Length(node->child) > 0 ) /*删除要删除的节点的孩子节点*/{
TLNode* trNode = (TLNode*)LinkList_Get(node->child, 0); /*从孩子链表中一个一个取出来 递归删除所有孩子节点*/recursive_delete(list, trNode->node);
}
LinkList_Destroy(node->child); /*销毁要删除节点的孩子链表*/free(node);/*将insert申请的内存释放*/}
}
}static int recursive_height(GTreeNode* node) /*递归算出树的高度 计算一个树的高度首先要算出子树的高度后+1*/{int ret = 0;if( node !=NULL )
{int subHeight = 0;int i = 0;for(i=0; ichild); i++)
{
TLNode* trNode = (TLNode*)LinkList_Get(node->child, i); /*从链表中取出子树的根节点*/subHeight= recursive_height(trNode->node);if( ret
{
ret=subHeight;
}
}
ret= ret + 1; /*加上根节点 故要+1*/}returnret;
}static int recursive_degree(GTreeNode* node) /*定义静态函数 外部无法看到 递归算出*/{int ret = -1;if( node !=NULL )
{int subDegree = 0;int i = 0;
ret= LinkList_Length(node->child);for(i=0; ichild); i++)
{
TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
subDegree= recursive_degree(trNode->node);if( ret < subDegree ) /*取最大值*/{
ret=subDegree;
}
}
}returnret;
}
GTree*GTree_Create()
{returnLinkList_Create();
}void GTree_Destroy(GTree* tree) /*此处数据封装 用户表面看起来只是一个tree(实际为一个单链表)*/{
GTree_Clear(tree);
LinkList_Destroy(tree);
}void GTree_Clear(GTree*tree)
{
GTree_Delete(tree,0); /*删除根节点就相当于删除整个树*/}int GTree_Insert(GTree* tree, GTreeData* data, int pPos) /*pPos---代表要插入的数据的父亲在表中的位置*/{
LinkList* list = (LinkList*)tree;int ret = (list != NULL) && (data != NULL) && (pPos < LinkList_Length(list)); /*合法性检测 pPos至少小于树节点(链表)长度*/
if( ret )
{
TLNode* trNode = (TLNode*)malloc(sizeof(TLNode)); /*(树)组织节点*/TLNode* cldNode = (TLNode*)malloc(sizeof(TLNode)); /*child节点 *---插入某个节点时,要将其插入两个链表,一个是组织链表,一个是父亲节点的子节点链表*/TLNode* pNode = (TLNode*)LinkList_Get(list, pPos); /*从树中(链表)中取出pPos位置的节点 强制转换为TLnode---里面有指向树节点的指针*/GTreeNode* cNode = (GTreeNode*)malloc(sizeof(GTreeNode)); /*申请一个树节点*/ret= (trNode != NULL) && (cldNode != NULL) && (cNode !=NULL);if( ret )
{
cNode->data = data; /*对新创建的通用节点赋值*/cNode->parent = NULL; /*暂时指定该节点没有双亲*/cNode->child =LinkList_Create();
trNode->node =cNode;
cldNode->node =cNode;
LinkList_Insert(list, (LinkListNode*)trNode, LinkList_Length(list)); /*插入到组织链表中*/
if( pNode != NULL ) /*根节点没有双亲 故此处要判断*/{
cNode->parent = pNode->node; /*将申请的节点赋给父亲节点*/LinkList_Insert(pNode->node->child, (LinkListNode*)cldNode, LinkList_Length(pNode->node->child)); /*插入到父亲节点的孩子链表中*/}
}else{
free(trNode);
free(cldNode);
free(cNode);
}
}returnret;
}
GTreeData* GTree_Delete(GTree* tree, intpos)
{
TLNode* trNode = (TLNode*)LinkList_Get(tree, pos);
GTreeData* ret = NULL; /*要删除的节点里保存的数据*/
if( trNode !=NULL )
{
ret= trNode->node->data;
recursive_delete(tree, trNode->node); /*递归删除,要删除所有孩子*/}returnret;
}
GTreeData* GTree_Get(GTree* tree, int pos) /*从组织链表中pos节点的数据返回*/{
TLNode* trNode = (TLNode*)LinkList_Get(tree, pos);
GTreeData* ret =NULL;if( trNode !=NULL )
{
ret= trNode->node->data;
}returnret;
}
GTreeData* GTree_Root(GTree*tree)
{return GTree_Get(tree, 0);
}int GTree_Height(GTree*tree)
{
TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);int ret = 0;if( trNode !=NULL )
{
ret= recursive_height(trNode->node);
}returnret;
}int GTree_Count(GTree*tree)
{returnLinkList_Length(tree);
}int GTree_Degree(GTree*tree)
{
TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);int ret = -1;if( trNode !=NULL )
{
ret= recursive_degree(trNode->node);
}returnret;
}void GTree_Display(GTree* tree, GTree_Printf* pFunc, int gap, chardiv)
{
TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);if( (trNode != NULL) && (pFunc !=NULL) )
{
recursive_display(trNode->node, pFunc, 0, gap, div);
}
}
数据结构树的基本操作_数据结构-树的基本操作相关推荐
- python数据结构与算法知识点_数据结构和算法基础知识点(示例代码)
数据结构和算法基础知识点 链表 1.链表是一种由节点组成的线性数据集合,每个节点通过指针指向下一个节点.它是 一种由节点组成,并能用于表示序列的数据结构. 2.单链表:每个节点仅指向下一个节点,最后一 ...
- 如何在vs中创建r树索引代码_线段树详解与实现
此篇文章用于记录<玩转数据结构>课程的学习笔记 什么是线段树 线段树也被称为区间树,英文名为Segment Tree或者Interval tree,是一种高级的数据结构.这种数据结构更多出 ...
- 数据结构折半查找例题_数据结构第9章例题与答案
第九章 集合 一. 选择题 1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度asl为( ).[北京航空航天大学 2000 一.8 (2分 ...
- java数据结构停车场管理问题_数据结构——停车场问题
实验三 停车场模拟管理程序的设计与实现 本实验的目的是进一步理解栈和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力. 一.问题描述 设停车场只有一个可停放几辆汽车的狭长通道,且 ...
- 数据结构折半查找例题_数据结构查找习题及答案
第九章 查找 一. 选择题 1. 若查找每个记录的概率均等, 则在具有 n 个记录的连续顺序文件中采用顺序查找法查找一 个记录,其平均查找长度 ASL 为 ( ) . A . (n-1)/2 ...
- 智慧树源码_智慧树平台系统开发
智慧树平台系统开发,吴生:,智慧树APP系统开发.智慧树模式系统开发.智慧树系统开发. 智慧树系统是趣步模式系统: 智慧树,对应趣步模式系统的"糖果":智慧枝,对应趣步模式系统的& ...
- 数据结构树的基本操作_[数据结构]树的建立与基本操作 解题报告
Problem Description 在本实验中,程序的输入是一个表示树结构的广义表.假设树的根为 root ,其子树森林 F = ( T1 , T2 , ... , Tn ),设与该树对应的广义表 ...
- 数据结构树的基本操作_数据结构二叉树的基本操作~~~~
展开全部 用递归的636f70793231313335323631343130323136353331333330356335方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树: 2.输出二 ...
- python链表和树实验报告_数据结构树和森林实验报告
_ 树和森林应用实验 实验报告 实验目的 ( 1) 掌握树和森林的二叉链表表示方法. (2) 掌握树和二叉树的结构及算法之间的对应关系. (3) 掌握树的两种遍历算法及其应用. 实验运行环境 Visu ...
最新文章
- [lcm] Qualcomm平台的显示屏lcd驱动移植步骤
- python可以做什么项目-python都能做什么
- SSM/SpringBoot+layui实现数据表格
- 2.6内核的配置与编译
- hadoop重命名文件_Hadoop -- 3. 从Flume到HDFS
- 第8章6节MonkeyRunner启动运行过程-启动Monkey 2
- Markdown 使用感受
- 开始Flex Builder 3
- 计算机硬盘被配制成动态磁盘。在这种情况下无法进行重装?,动态磁盘转换为基本磁盘(完美解决方案)...
- java代码分析及分析工具
- JAVA自学之路 来自尚学堂马士兵老师
- g++编译时,出现test.c:(.text+0xc7):对‘cv::_InputArray::_InputArray(cv::Mat const)’未定义的引用
- 2022-2028全球与中国商用车辆HMI解决方案市场现状及未来发展趋势
- 大数据工程师的日常工作内容是干嘛?
- springboot实战,实现发送邮件,gmail邮件,包括发送附件还有正文,以及注意覆盖问题
- 基于爬虫爬取的数据,完成数据展示网站
- C++ OpenCV特征提取之KAZE和AKAZE的匹配
- 〖Python接口自动化测试实战篇①〗- 自动化测试基础扫盲及项目的生命周期详述
- 五秒人生:“从上帝到长袜子皮皮”的200个人物传记
- 【渝粤教育】国家开放大学2018年春季 0701-21T公共政策学 参考试题
热门文章
- 【Python】太神奇了,一行命令行将Notebook转换成PPT动态网页!
- vim 自用/.vimrc配置
- 200亿!达摩院全球总部开建,不为盈利的达摩院要撑起102年的阿里巴巴!
- 解决校园网无法访问csdn问题
- 学生信息管理系统(VB 干货篇三)
- linux查系统版本
- Linux系统编程(十)--高级IO-异步IO
- 8T硬盘安装windows server版本
- 第十二届蓝桥杯 2021年国赛真题 (Java 大学A组)
- URLError: <urlopen error [Errno 11004] getaddrinfo failed>关于使用seabron加载数据集报错的解决方案