樹(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;
}
一般很少用到吧,數據結構書上都很少有介紹具體操作的。估計理解下存儲的方法就好吧。