使用一維數組,每一個元素有兩個域,數據域和父結點索引域node
#define size 10 typedef struct { char data; int parent; } Node; Node slist[size];
找父結點容易,找結點 的孩子麻煩,需遍歷整張表。數組
使用一維數組存儲樹中全部節點,每一個元素有兩個域數據域和第一個孩子節點的指針域安全
孩子節點也有兩個域分別是自身對應的索引域以及下一個孩子節點的指針域數據結構
# define MAXND 20 typedef struct bnode {int child; struct bnode *next; }node,*childlink; typedef struct { char data; childlink hp; }headnode; headnode link[MAXND];
查找子節點方便,查找父結點困難指針
爲了接查找父結點困難的問題,能夠在數組元素中增長一個域存儲父結點的索引code
# define MAXND 20 typedef struct bnode { int child; struct bnode *next; }node,*childlink; typedef struct{ char data; int parent; childlink hp; }headnode; headnode link[MAXND];
使用鏈表存儲樹中的節點,鏈表中每一個元素有三個域分別爲第一個孩子指針域
,數據域
,下一個兄弟指針域
索引
節點組成:class
Typedef struct tnode { int data; struct tnode *son,*brother; }*Tree;
數據結構定義與二叉樹的二叉鏈表表示法安全相同,可是指針所表示的含義是不一樣的二叉樹
查找父結點需遍歷鏈表遍歷
轉換方法:
圖示:
一棵樹的孩子兄弟鏈表示法與將該樹轉爲二叉樹後的二叉鏈表表示法存儲結構徹底相同,僅節點中指針含義不一樣
設有如下樹(左),並將其轉換爲二叉樹(右):
使用孩子兄弟表示法存儲以上樹獲得存儲結構如圖(左)
使用二叉鏈表表示法存儲轉換後的二叉樹獲得結構如圖(右)
轉換方法:
圖示:
明確:根節點沒有右孩子的二叉樹可轉爲通常樹
還原方法:
也是樹轉二叉樹的逆運算即以根節點爲中心全部節點逆時針旋轉45度
圖示:
明確:根節點有右孩子的二叉樹可轉爲森林
還原方法:
二叉樹還原爲通常樹
的方法轉換爲通常樹也是森林轉二叉樹的逆運算
圖示:
先序遍歷:先訪問根節點,而後依次先序遍歷根的每一個子樹
後序遍歷:先依次遍歷每棵子樹,最後訪問根節點
層次遍歷:從上到下從左到右依次遍歷全部節點
因爲子節點個數不肯定因此沒有沒法實現中序遍歷
示例:
上圖對應的遍歷順序
先序:ABCDE
後序:BDCEA
層次:ABCED
樹的遍歷結果與轉爲二叉樹後的遍歷結果對應關係
樹 => 二叉樹
先序 == 先序
後序 == 中序
先序遍歷:依次使用先序遍歷森林中每棵樹
中序遍歷:對每棵樹按照先子後根的方式遍歷每一個節點
之因此叫中序: 由於 樹的後序==樹轉二叉樹的中序
示例:
上圖對應的遍歷順序
先序:ABCDEFGHJI
中序:BCDAFEJHIG