数据结构(知识点碎片十三)

300 阅读2分钟
  • 孩子结点、双亲结点和兄弟结点

在一棵树中,每个结点的后继结点被称为该结点的孩子结点(children)。相应地,该结点被称为孩子结点的双亲结点(parents)。具有同一双亲结点的孩子结点互为兄弟结点(sibling)。进一步推广这些关系,可以把每个结点对应子树中的所有结点(除自身外)称为该结点的子孙结点(descendant),把从根结点到达某个结点的路径上经过的所有结点(除自身外)称为该结点的祖先结点(ancestor)。

  • 结点层次和树的高度

树中的每个结点都处在一定的层次上。结点层次(level)或结点深度(depth)是从树根开始定义的,根结点为第一层,它的孩子结点为第二层,依此类推,一个结点所在的层次为其双亲结点的层次加1。树中结点的最大层次称为树的高度(height of tree)或树的深度(depth of tree)。

image.png

  • 有序树和无序树

若树中各结点的子树是按照一定的次序从左向右安排的,且相对次序是不能随意变换的,则称为有序树(ordered tree),否则称为无序树(unordered tree)。一般情况下,如果没有特别说明,默认树都是指有序树。

  • 森林

n(n>0)个互不相交的树的集合称为森林。把含有多棵子树的树的根结点删去就成了森林(forest)。反之,给m(m>1)棵独立的树加上一个根结点,并把这m棵树作为该结点的子树,则森林就变成了一棵树.


3. 树的基本运算

  • 先根遍历
  1. 访问根结点;
  2. 按照从左到右的顺序先根遍历根结点的每一棵子树。
  • 后根遍历
  1. 按照从左到右的顺序后根遍历根结点的每一棵子树;
  2. 访问根结点。
  • 层次遍历
  1. 从根结点开始按从上到下、从左到右的次序访问树中的每一个结点。

4. 树的存储结构

  • 双亲存储结构(PTree)

顺序存储;求某个结点的双亲结点十分容易,但在求某个结点的孩子结点时需要遍历整个存储结构

int tree[maxSize]; 
tree[0] = -1; 
tree[1] = 0; 
tree[2] = 0; 
tree[3] = 0; 
tree[4] = 1; 
tree[5] = 1;
  • 孩子链存储结构(TSonNode)

查找某结点的孩子结点十分方便,但查找某结点的双亲结点比较费时,此外,当树的度较大时存在较多的空指针域。

typedef struct Branch		
{
int cIdx;		
Branch* next;	
}Branch;	

typedef struct
{
int data;
Branch* first;	
}TNode;
  • 孩子兄弟链存储结构(TSBNode)

实际上是把该树转换为二叉树的存储结构。