#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);

}

}

数据结构树的基本操作_数据结构-树的基本操作相关推荐

  1. python数据结构与算法知识点_数据结构和算法基础知识点(示例代码)

    数据结构和算法基础知识点 链表 1.链表是一种由节点组成的线性数据集合,每个节点通过指针指向下一个节点.它是 一种由节点组成,并能用于表示序列的数据结构. 2.单链表:每个节点仅指向下一个节点,最后一 ...

  2. 如何在vs中创建r树索引代码_线段树详解与实现

    此篇文章用于记录<玩转数据结构>课程的学习笔记 什么是线段树 线段树也被称为区间树,英文名为Segment Tree或者Interval tree,是一种高级的数据结构.这种数据结构更多出 ...

  3. 数据结构折半查找例题_数据结构第9章例题与答案

    第九章  集合 一. 选择题 1.若查找每个记录的概率均等,则在具有n个记录的连续顺序文件中采用顺序查找法查找一个记录,其平均查找长度asl为(    ).[北京航空航天大学 2000 一.8 (2分 ...

  4. java数据结构停车场管理问题_数据结构——停车场问题

    实验三 停车场模拟管理程序的设计与实现 本实验的目的是进一步理解栈和队列的逻辑结构和存储结构,进一步提高使用理论知识指导解决实际问题的能力. 一.问题描述 设停车场只有一个可停放几辆汽车的狭长通道,且 ...

  5. 数据结构折半查找例题_数据结构查找习题及答案

    第九章 查找 一. 选择题 1. 若查找每个记录的概率均等, 则在具有 n 个记录的连续顺序文件中采用顺序查找法查找一 个记录,其平均查找长度 ASL 为 (    ) . A . (n-1)/2   ...

  6. 智慧树源码_智慧树平台系统开发

    智慧树平台系统开发,吴生:,智慧树APP系统开发.智慧树模式系统开发.智慧树系统开发. 智慧树系统是趣步模式系统: 智慧树,对应趣步模式系统的"糖果":智慧枝,对应趣步模式系统的& ...

  7. 数据结构树的基本操作_[数据结构]树的建立与基本操作 解题报告

    Problem Description 在本实验中,程序的输入是一个表示树结构的广义表.假设树的根为 root ,其子树森林 F = ( T1 , T2 , ... , Tn ),设与该树对应的广义表 ...

  8. 数据结构树的基本操作_数据结构二叉树的基本操作~~~~

    展开全部 用递归的636f70793231313335323631343130323136353331333330356335方法实现以下算法: 1.以二叉链表表示二叉树,建立一棵二叉树: 2.输出二 ...

  9. python链表和树实验报告_数据结构树和森林实验报告

    _ 树和森林应用实验 实验报告 实验目的 ( 1) 掌握树和森林的二叉链表表示方法. (2) 掌握树和二叉树的结构及算法之间的对应关系. (3) 掌握树的两种遍历算法及其应用. 实验运行环境 Visu ...

最新文章

  1. [lcm] Qualcomm平台的显示屏lcd驱动移植步骤
  2. python可以做什么项目-python都能做什么
  3. SSM/SpringBoot+layui实现数据表格
  4. 2.6内核的配置与编译
  5. hadoop重命名文件_Hadoop -- 3. 从Flume到HDFS
  6. 第8章6节MonkeyRunner启动运行过程-启动Monkey 2
  7. Markdown 使用感受
  8. 开始Flex Builder 3
  9. 计算机硬盘被配制成动态磁盘。在这种情况下无法进行重装?,动态磁盘转换为基本磁盘(完美解决方案)...
  10. java代码分析及分析工具
  11. JAVA自学之路 来自尚学堂马士兵老师
  12. g++编译时,出现test.c:(.text+0xc7):对‘cv::_InputArray::_InputArray(cv::Mat const)’未定义的引用
  13. 2022-2028全球与中国商用车辆HMI解决方案市场现状及未来发展趋势
  14. 大数据工程师的日常工作内容是干嘛?
  15. springboot实战,实现发送邮件,gmail邮件,包括发送附件还有正文,以及注意覆盖问题
  16. 基于爬虫爬取的数据,完成数据展示网站
  17. C++ OpenCV特征提取之KAZE和AKAZE的匹配
  18. 〖Python接口自动化测试实战篇①〗- 自动化测试基础扫盲及项目的生命周期详述
  19. 五秒人生:“从上帝到长袜子皮皮”的200个人物传记
  20. 【渝粤教育】国家开放大学2018年春季 0701-21T公共政策学 参考试题

热门文章

  1. 【Python】太神奇了,一行命令行将Notebook转换成PPT动态网页!
  2. vim 自用/.vimrc配置
  3. 200亿!达摩院全球总部开建,不为盈利的达摩院要撑起102年的阿里巴巴!
  4. 解决校园网无法访问csdn问题
  5. 学生信息管理系统(VB 干货篇三)
  6. linux查系统版本
  7. Linux系统编程(十)--高级IO-异步IO
  8. 8T硬盘安装windows server版本
  9. 第十二届蓝桥杯 2021年国赛真题 (Java 大学A组)
  10. URLError: <urlopen error [Errno 11004] getaddrinfo failed>关于使用seabron加载数据集报错的解决方案