数据结构复习——树

一、树的基本术语

1、节点的度和树的度:树中某个节点的子树的个数称为该节点的度,树中最大的节点的度称为树的度。通常将度为m的树称为m次树。
2、度为零的节点称为终端节点或叶子节点,度不为零的节点称为非终端节点或分支节点
3、兄弟节点:具有同一双亲节点的多个节点。
4、树的层次 从根节点开始定义,根节点为第一层,一个树的最大层次称为树的高度或树的深度
5、森林:n(n>0)个互不相交的树的集合称为森林,只要把树的根节点去掉就成了森林,反之只要给n棵独立的树加上一个共同的父节点则由森林变成了树。

二、树的性质

1、树的总节点数=所有节点的度数和+1
2、度为m的树的第i层上最多有m的i-1次方个节点
3、高度为h的m次树最多有(m^h-1)/(m-1)个节点

三、树的存储结构

1、双亲存储结构
是一种顺序村塾结构,用一组连续空间存储树的所有节点。

typedef struct 
{
    ElemType data;
    int parent;
}PTree[MaxSize];

2、孩子链存储结构
孩子链存储结构按照树的度来设计节点的孩子节点指针域个数。

typedef struct node
{   
    ElemType data; //节点的值
    struct node *sons[MaxSons]; //指向孩子节点
}TSonNode;

数据结构复习——树_第1张图片

3、孩子兄弟链存储结构

typedef struct tnode
{
    ElemType data; //存放节点的值
    struct tnode *hp; //指向兄弟
    struct tnode *vp; //指向孩子节点
}TSBNode;

孩子兄弟链存储结构中。指向兄弟的指针域和指向孩子的指针域是不能改变随意顺序的,实际上是把该树转化为了二叉树的存储结构。
树的形状同上
数据结构复习——树_第2张图片



例题

以孩子兄弟链作为存储结构,编写一个求树高度的递归算法。
设f(t)为树t的高度,其递归模型为:
f(t)=0,当t==NULL;
f(t)=1,当t!=NULL&&t->vp==NULL,即t没有其他孩子节点;
f(t)=MAX(f(p))+1(p为t的孩子),其他情况

int TreeHeight(TSBNode *t)
{
    TSBNode *p;
    int m,max=0; //max保存最大深度
    if(t==NULL) //对应第一种情况,t为空
        return 0;
    else if(t->vp == NULL) //对应第二种情况,t没有孩子
            return 1;
    else  //此时t有孩子,要求出来t的各个孩子中的最大深度
    {
        p = t->vp; //p指向t的第一个孩子节点
        while(p!=NULL) //从t的所有孩子节点中找出一个高度最大的
        {
        m = Treeheight(p);
        if(m>max) 
            max = m;
        p = p->hp;
        }
        return (max+1);
    }

你可能感兴趣的:(数据结构复习)