赞
踩
树形结构是一类重要的非线性结构。树形结构是结点之间有分支,并且具有层次关系的结构,类似于大自然中的树。
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因
为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:
①每个结点有零个或多个子结点;(每个结点有零个或多个后继)
②没有父结点的结点称为根结点;(树中有且只有一个结点,没有前驱,该节点为根结点)
③每一个非根结点有且只有一个父结点;(除根结点外,其余结点有且只有一个直接前驱)
④除了根结点外,每个子结点可以分为多个不相交的子树 。
结点的度:一个结点中包含的子树的个数称为结点的度,例如:A的度为2,B的度为3,H的度为0
树的度:一棵树中,最大的结点的度,称为树的度,例如:上图树的度为3
结点的层次:从根开始定义,根为第一层,根的子节点为第二层,依次类推
树的深度或高度:树中结点的最大层次,例如:上图树的高度为4
叶结点或终端结点:度为0的结点称为叶结点。(当一棵树中只有一个结点,这个结点既是根结点也是叶结点)例如:上图的D、F、G、H、I
非终端结点或分支节点:度不为0的结点。例如:B、C、E等
双亲结点或父结点:若一个结点包含子结点,则这个结点称为其子结点的父节点。例如:A是B、C的父节点
孩子结点或子结点:结点的子树的根称为该结点的孩子。例如:B、C是A的孩子
兄弟结点:具有相同父节点的结点互称为兄弟结点:例如B、C是兄弟结点
堂兄弟结点:双亲在同一层的结点互称为堂兄弟结点。例如F、G为堂兄弟结点
结点的祖先:从根到该结点所经分支上的所有结点。例如:A是所有结点的祖先
子孙:以某个结点为根的子树中任一结点称为该结点的子孙。例如:所有结点都是A的子孙
森林:由m(m>=0)棵互不相交的树的集合称为森林。
1.树中的结点数等于所有结点的度数加1。
2.度为m的树中第i层上至多有m^(i−1)个结点(i≥1)。
3.高度为h的m叉树至多有(m^h-1)/(m-1)个结点
4.具有n个结点的m叉树的最小高度为logm(n(m-1)+1)
树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如:双亲表示法,孩子表示法、孩子兄弟表示法等等。
1.顺序存储结构
双亲表示法:用一组连续的存储空间存储树的结点,同时在每个结点中,用一个变量存储该结点的双亲结点在数组中的位置。
2.链式存储结构
孩子表示法:把每个结点的孩子结点排列起来存储成一个单链表。所以n个结点就有n个链表; 如果是叶子结点,那这个结点的孩子单链表就是空的; 然后n个单链表的的头指针又存储在一个顺序表(数组)中。
孩子兄弟表示法:顾名思义就是要存储孩子和孩子结点的兄弟,具体来说,就是设置两个指针,分别指向该结点的第一个孩子结点和这个孩子结点的右兄弟结点。
孩子表示法:
孩子兄弟表示法演示:
代码如下:
- typedef int DataType;
- //结点定义
- struct Node
- {
- struct Node* _firstChild1; // 第一个孩子结点
- struct Node* _pNextBrother; // 指向其下一个兄弟结点
- DataType _data; // 结点中的数据域
- };
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。