1、树:n个结点的有限集,n=0时为空树。

1)特点:

(1)有且仅有一个特定的称为根的结点。

(2)有若干个互不相交的子树,这些子树本身也是一棵树。

(3)树的根结点没有前驱结点,除根结点外的所有结点有且只有一个前驱结点。

(4)树中所有结点可以有零个或多个后继结点。

2)通俗的定义:

(1)树由节点和边组成。

(2)每个结点只有一个父结点,但可以有多个子结点。

(3)但有一个结点例外,该结点没有父结点,该结点称为根结点。

3)树分类:

(1)一般树:任意一个结点的子结点的个数都不受限制。

(2)二叉树:任意一个结点的子结点个数最多两个,且子结点的位置不可更改,二叉树的子树有左右之分。

(3)森林:n个互不相交的树的集合。

4)树的基本性质

(1)树中的结点数等于所有结点的度数+1。

(2)度为m的树中第i层上至多有mi-1个结点。

(3)高度为h的m叉树至多有(mh-1)/(m-1)个结点。

(4)具有n个结点的m叉树的最小高度为logm(n(m-1)+1)。

2、专业术语:

1)深度:树中结点的最大层次,即从根节点到最底层节点的层数,根结点是第一层。

2)叶子结点:没有子结点的结点。

3)非终端结点:实际上就是非叶子结点。

4)度:子结点的个数。结点的度:结点拥有的子树个数。树的度:树内各结点的度的最大值。

5)层次:从根开始定义起,根为第一层,根的孩子为第二层。

6)结点的高度:从叶子结点开始自底向上逐层累加。

7)路径长度:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目为长度。

8)树的路径长度:从树根到每个结点的路径长度之和。

9)树的带权路径长度:树中所有叶子结点的带权路径长度之和,记作WPL。

3、树的存储:

1)双亲表示法:采用一组连续空间来存储每个结点,同时在每个结点中增设一个伪指针,指示双亲结点在数组中的位置。

(1)优点:求父节点方便。

(2)双亲表示法的存储结构描述

typedef struct {

int data;

int parent;

}PTNode;

typedef struct {

PTNode nodes[Maxsize];

int n;

}PTree;

2)孩子表示法:将每个结点的孩子结点都用单链表链接起来形成一个线性结构,n个结点就有n个孩子链表(叶子结点的孩子链表为空表)。

(1)优点:求子节点方便。

3)孩子兄弟表示法(二叉树表示法):每个结点包含三部分:结点值、指向结点第一个孩子结点的指针、指向结点下一个兄弟结点的指针。

(1)优点:求父节点和子节点都很方便,方便实现树转化为二叉树;

(2)具体转化方法:保证任意一个结点的左指针域指向它的第一个孩子、右指针域指向它的下一个兄弟,只要能满足此条件,就可以把一个普通树转化为二叉树。

(3)特点:一个普通树转化成的二叉树一定没有右子树,因为根结点没有兄弟。

(4)孩子兄弟表示法的存储结构类型描述

typedef struct CSNode {

int data;

struct CSNode *firstchild, *nextsibling;

}CSNode,*CSTree;

计算以孩子兄弟表示法存储的森林的叶子数

int leaves(CSTree t)

{

if (t == NULL)

{

return 0;

}

if (t->firstchild == NULL)

{

return 1 + leaves(t->nextsibling);

}

else

{

return leaves(t->firstchild) + leaves(t->nextsibling);

}

}

递归求以孩子兄弟表示法表示的树的深度

int height(CSTree t)

{

int l, r;

if (t == NULL)

{

return 0;

}

else

{

l = height(t->firstchild);

r = height(t->nextsibling);

if (l + 1 > r)

{

return l + 1;

}

else

{

return r;

}

}

}

4、森林的存储:先把森林转化为二叉树,再存储二叉树。

5、树操作:

1)树的遍历

(1)先根遍历

先访问根结点、再按从左到右的顺序遍历根结点的每棵子树。

(2)后根遍历

先按从左到右的顺序遍历根结点的每棵子树、再访问根结点。

2)森林的遍历

(1)先序遍历

先访问森林中第一棵树的根结点,再先序遍历第一棵树中根结点的子树森林,再先序遍历除去第一棵树之后剩余的树组成的森林。

(2)中序遍历

先中序遍历森林中第一棵树中根结点的子树森林,再访问森林中第一棵树的根结点,再中序遍历除去第一棵树之后剩余的树组成的森林。

6、树应用:

1)树是数据库中数据组织的一种重要形式。

操作系统子父进程的关系和面对对象语言中类的继承关系本身就是一棵树。

2)并查集的结构定义

int UFSets[Maxsize];

(1)初始化

void initial(int S[])

{

for (int i = 0; i < Maxsize; i++)

{

S[i] = -1;

}

}

(2)查找并返回包含元素e的树的根

int find(int S[], int e)

{

while (S[e]>=0)

{

e = S[e];

}

return e;

}

(3)求两个不想交子集合的并集

void uniontree(int S[], int root1, int root2)

{

S[root2] = root1;

}

7、赫夫曼树(最优树):一棵带权路径长度最短的树,没有度为1 的结点,一棵有n0个叶子结点的树,共有2n0-1个结点。

1)构造过程

(1)将n个结点作为n棵含一个结点的二叉树。

(2)从中选取两棵根结点权值最小的树作为新结点的左、右子树,新结点的权值为左右子树根结点的权值之和。

(3)重复。

2)特点

(1)每个初始结点最终成为叶结点,权值越小的结点到根结点的路径长度越大。

(2)构造过程中共新建了n-1个结点,所以结点总数为2n-1个。

(3)不存在度为1 的结点。

c语言孩子兄弟法存储一棵树,数据结构(C语言版)---树相关推荐

  1. c语言孩子兄弟法存储一棵树,树的孩子兄弟表示法

    前面讲解了存储普通树的双亲表示法和孩子表示法,本节来讲解最后一种常用方法--孩子兄弟表示法. 图 1 普通树示意图 树结构中,位于同一层的节点之间互为兄弟节点.例如,图 1 的普通树中,节点 A.B ...

  2. 假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示。假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下:

    假设某专业有若干个班,每个班有若干学生,每个学生包含姓名和分数,这样构成一棵树,如图1所示.假设树中每个结点的name域均不相同,该树采用孩子兄弟链存储结构,其结点类型定义如下: typedef st ...

  3. 使用双亲指针表示法存储一棵树,可以方便解决下列哪个应用问题( )

    使用双亲指针表示法存储一棵树,可以方便解决下列哪个应用问题( C ) A. 最短路径 B. 树的遍历 C. 等价类 D. 优先级队列 等价类问题通过并查集算法实现. 等价类采用存储结构为双亲节点表示法 ...

  4. /*深度优先建立深林,孩子兄弟法*/

    /*深度优先建立深林,孩子兄弟法*/ void DFSForest(Graph G , Tree &T) { T = NULL ; memset(vi , 0 , sizeof(vi)); f ...

  5. 【数据结构】求以孩子兄弟表示法存储的森林的叶子结点数,树高

    1.求叶子结点数 T的第一个孩子存在T->firstChild里,所以如果T连第一个孩子都没有,那肯定为叶子结点,也就是说T->firstChild==NULL. 所以说,以孩子兄弟表示法 ...

  6. java 孩子节点所有_树的孩子-兄弟结点存储之Java实现

    /** * 本类为树(孩子-兄弟存储)的结点 * * @version 1.0, 2008-01-24 * @author 李赫元 北京交通大学 * @since JDK1.6 */ public c ...

  7. 二叉树计算叶子节点c语言报告,二叉树计算叶子节点的算法(数据结构)C语言版...

    <二叉树计算叶子节点的算法(数据结构)C语言版>由会员分享,可在线阅读,更多相关<二叉树计算叶子节点的算法(数据结构)C语言版(1页珍藏版)>请在人人文库网上搜索. 1.* H ...

  8. 河北工程大学c语言期末考试及答案,河北工程大学之数据结构c语言版期末考试复习试题...

    河北工程大学之数据结构c语言版期末考试复习试题 <数据结构与算法>复习题 一.选择题. 1.在数据结构中,从逻辑上可以把数据结构分为 C . A.动态结构和静态结构 B.紧凑结构和非紧凑结 ...

  9. 用c语言实现串的存储结构是指,数据结构学习笔记-串(C语言实现)

    串由零个或多个字符组成,说白了就是字符串.串的存储方式相对于线性表来讲有些不同,他分为以下几种:顺序存储.堆分配存储.链式存储.顺序存储通常在数组中的头元素存放字符串长度.堆分配存储通常会动态分配空间 ...

最新文章

  1. Spring Boot 整合 Elastricsearch + LogStash + Kibana
  2. linux内核分两种,Linux内核版本
  3. spring-security-oauth2注解详解
  4. appium java 点击坐标_appium定位元素java篇【转】
  5. 5.1 tushare包介绍
  6. fusion360安装包_【请注意】2020年以前从Autodesk中国区网站下载的Fusion 360已不能自动升级...
  7. jq动态获取input的值传给html,jquery 保证html()拿到的html字符串包含input的value值
  8. 使用中断后不停止_乔丹体育公司构成侵权,为何又不判令彻底停止使用“乔丹”注册商标?法院解释来了...
  9. python os.path模块常用方法详解
  10. Linux软件安装为什么名字不一样
  11. 《天天数学》连载05:一月五日
  12. flask查询User,返回对象列表,提示ypeError: Object of type ‘bytes‘ is not JSON serializable解决办法
  13. C++知识点总结(三)
  14. CentOS6.2安装LAMP+DRUPAL网站(1)
  15. python在线游戏_几个简单的python小游戏
  16. OpenGL超级宝典(第7版)笔记22 原子计数器 清单5.31-5.34
  17. 一款非常优秀的内存数据库——lmdb
  18. L298N电机驱动模块
  19. 【语音控制ROS】PocketPhinx语音包的使用<三>
  20. 神经网络知识点汇总——FNN

热门文章

  1. MATLAB计算杨氏模量,四阶弹性模量Cijkl如何在matlab里表示啊? - 计算模拟 - 小木虫 - 学术 科研 互动社区...
  2. R语言中的dnorm(),pnorm(),qnorm(),rnorm()的解释
  3. 多倍体单体型组装算法研究
  4. linux环境上c++ boost安装boost_1_67_0.tar
  5. 计算机服务修复,修复服务注册缺失或已损坏错误在win10中的方法
  6. web大屏展示用到的组件_基于 HTML5 的工业组态高炉炼铁 3D 大屏可视化
  7. 二十四、死锁的处理策略---检测和解除
  8. 目标检测--Feature Pyramid Networks for Object Detection
  9. 报错解决:ResourceExhaustedError: OOM when allocating tensor with shape
  10. Linux新建用户名