樹的三種表示方式

樹(tree)是n個結點的有限集合。n=0時稱爲空樹,在任意一顆非空樹中:
①有且僅有一個特定的稱號爲根(root)的結點;
②當n>1時,其餘結點分爲m(m>0)個互不相交的有限集合T1,T2…Tm,其中每一個集合本身又是一棵樹,並且稱爲根的子樹(subTree);

這裏寫圖片描述
特別注意只要有相交的子樹的就不是樹。
每一個結點所擁有的子樹的個數稱爲結點的度(Degree)度爲0的結點稱爲葉子結點(Leaf)或端結點。樹的度是樹內各結點的度的最大值。

結點間的關係
這裏寫圖片描述

下面我們來簡單介紹一下三種樹的存儲結構
I 雙親表示法
這裏寫圖片描述
我們來看看這個樹如何表示
這裏寫圖片描述

按照雙親表示法生成對於的表
這裏寫圖片描述

其中-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<T>::PTtree()
{
}
template<typename T>
PTtree<T>::~PTtree()
{
}

#endif 

II 孩子表示法
具體的辦法是,把每個孩子結點排列起來,以單鏈表作存儲結構,則n個結點有n個孩子鏈表,如果是葉子結點則單鏈表爲空,然後n個頭指針組成一個線性表,採樣順序結構,放在一個數組中。
這裏寫圖片描述

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

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

#endif

III 孩子兄弟表示法
任意一顆樹,它的結點的第一個孩子如果就是唯一的,它的兄弟如果也是唯一的,設置兩個指向該結點的第一個孩子和它兄弟的結點
這裏寫圖片描述
一個結點包含一個數據域和兩個指針域。
這這棵樹的表示爲
這裏寫圖片描述
則可以定義爲

//孩子兄弟表示法

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

private:
    CSnode<T> *Head;    //頭結點
};
template<typename T>
CStree<T>::CStree()
{
    Head = new CSnode<T>;
}
template<typename T>
CStree<T>::~CStree()
{
    delete Head;
}

一般很少用到吧,數據結構書上都很少有介紹具體操作的。估計理解下存儲的方法就好吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章