树的三种表示方式

树(tree)是n个结点的有限集合。n=0时称为空树,在任意一颗非空树中:
①有且仅有一个特定的称号为根(root)的结点;
②当n>1时,其余结点分为m(m>0)个互不相交的有限集合T1,T2…Tm,其中每一个集合本身又是一棵树,并且称为根的子树(subTree);

树的三种表示方式_第1张图片
特别注意只要有相交的子树的就不是树。
每一个结点所拥有的子树的个数称为结点的度(Degree)度为0的结点称为叶子结点(Leaf)或端结点。树的度是树内各结点的度的最大值。

结点间的关系
树的三种表示方式_第2张图片

下面我们来简单介绍一下三种树的存储结构
I 双亲表示法
树的三种表示方式_第3张图片
我们来看看这个树如何表示
树的三种表示方式_第4张图片

按照双亲表示法生成对于的表
树的三种表示方式_第5张图片

其中-1表示为根结点,没有双亲结点。

//树的父母双亲表示方法
#ifndef TREEFM_H_
#define TREEFM_H_
const int MAX_TREE_SIZE=100;

template<typename T>
struct PTnode       //结点结构
{
    T data;        //结点数据
    int parent;    //结点位置
};
template<typename T>
class PTtree
{
public:
    PTtree();
    ~PTtree();
    void PTtreeInput();
private:
    PTnode nodes[MAX_TREE_SIZE];
    int r, n;                    //根的位置和结点数

};
template<typename T>
PTtree::PTtree()
{
}
template<typename T>
PTtree::~PTtree()
{
}

#endif 

II 孩子表示法
具体的办法是,把每个孩子结点排列起来,以单链表作存储结构,则n个结点有n个孩子链表,如果是叶子结点则单链表为空,然后n个头指针组成一个线性表,采样顺序结构,放在一个数组中。
树的三种表示方式_第6张图片

//树的孩子表示法
#ifndef CTTREE_H_
#define CTTREE_H_
#include "LinkList.h"
const int MAX_TREE_SIZE = 100;
template<typename T>
class CTtree:public LinkList
{
public:
    CTtree();
    ~CTtree();

private:
    LinkList m_CTtree[MAX_TREE_SIZE];
    int n;
};
template<typename T>
CTtree::CTtree()
{
}
template<typename T>
CTtree::~CTtree()
{
}

#endif

III 孩子兄弟表示法
任意一颗树,它的结点的第一个孩子如果就是唯一的,它的兄弟如果也是唯一的,设置两个指向该结点的第一个孩子和它兄弟的结点
这里写图片描述
一个结点包含一个数据域和两个指针域。
这这棵树的表示为
树的三种表示方式_第7张图片
则可以定义为

//孩子兄弟表示法

template<typename T>
struct CSnode
{
    T data;
    CSnode *firstchild, *rightsib;   //右孩子和兄弟
};
template<typename T>
class CStree
{
public:
    CStree();
    ~CStree();

private:
    CSnode *Head;    //头结点
};
template<typename T>
CStree::CStree()
{
    Head = new CSnode;
}
template<typename T>
CStree::~CStree()
{
    delete Head;
}

一般很少用到吧,数据结构书上都很少有介绍具体操作的。估计理解下存储的方法就好吧。

你可能感兴趣的:(小白数据结构)