1、樹的存儲結構node
1.雙親表示法數據結構
假設以一組連續空間存儲樹的結點,同時在每一個結點中附近一個指示器指示其雙親結點在鏈表的位置spa
#define MAXSIZE 100 typedef struct PTNode{//結點結構 TElemType data; int parent; }PTNode; typedef struct{ PYNode nodes[MAXSIZE]; int r,n;//根的位置和結點數 }PTree;
這種存儲結構利用每一個結點(除了根結點外)只有惟一雙親的性質。反覆利用PARENT(T,x)操做,直到碰見無雙親結點時便找到了樹的根,可是在這種表示方法中,求結點的孩子遍歷整個結構。指針
因爲根結點是沒有雙親的,約定根結點的位置位置域爲-1.,根據結點的parent
指針很容易找到它的雙親結點。所用時間複雜度爲O(1),直到parent爲-1時,表示找到了樹結點的根。code
2.孩子表示法blog
數據結構(P136頁)class
因爲樹中每一個結點可能有多棵樹,則可用多重鏈表,即每一個結點有多個指針域,其中每一個指針指向一棵子樹的根結點二叉樹
把每一個結點的還結點排列起來,當作一個線性表,且以單鏈表做爲存儲結構,則n個結點有n個孩子鏈表(葉子的孩子鏈表位空表)。而n個頭指針又組成一個線性表,爲了便於查找,可採用順序存儲結構。遍歷
typedef struct CTNode{//孩子結點 int child; struct CTNode *next; }ChildPtr; typedef struct{ TElemType data;
//int parent;雙親孩子表示法的存儲需加上這條 ChildPtr firstchild;//孩子鏈表頭結點 }CTBox; typedef struct{ CTBox node[MAXSIZE]; int n,r;//結點數和根的位置; }CTree;
3.孩子兄弟表示法方法
又稱二叉樹表示法或二叉鏈表表示法,即以二叉鏈表做爲樹的存儲結構。鏈表中結點的兩個鏈域分別指向該結點的第一個孩子結點和下一個兄弟結點,分別爲firstchild域和nextsibling域
typedef struct CNode{ ElemType data; struct CSNode *firstchild,*nextsibling; }CSNode,*CSTree;
該種存儲結構便於實現個各類樹的操做。首先易於實現找結點孩子等的操做。例如若要訪問結點x的第i個孩子,則只要先從firstchild域找到第一個孩子,而後沿着孩子結點的nextsibling域連續走i-1步。即可找到x的第i個孩子結點。固然,若是爲每一個結點增設一個PAARENT域,則一樣能方便實現PARENT(T,x)操做。
2、樹轉換爲二叉樹
樹轉換爲二叉樹
(1)加線。在全部兄弟結點之間加一條連線。
(2)去線。樹中的每一個結點,只保留它與第一個孩子結點的連線,刪除它與其它孩子結點之間的連線。
(3)層次調整。以樹的根節點爲軸心,將整棵樹順時針旋轉必定角度,使之結構井井有條。(注意第一個孩子是結點的左孩子,兄弟轉換過來的孩子是結點的右孩子)
森林轉換爲二叉樹
(1)把每棵樹轉換爲二叉樹。
(2)第一棵二叉樹不動,從第二棵二叉樹開始,依次把後一棵二叉樹的根結點做爲前一棵二叉樹的根結點的右孩子,用線鏈接起來。