双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法),森林和二叉树的转换
樹的存儲結構
- 一、雙親表示法
- 二、孩子表示法(孩子鏈表)
- 三、孩子兄弟表示法(二叉樹表示法、二叉鏈表表示法)
- 四、森林(樹)和二叉樹的轉換
一、雙親表示法
實現:定義數組結構存放樹的結點,每個結點含兩個域:
數據域:存放結點本身數據信息。
雙親域:指示本結點的雙親結點在數組中的位置。
結點結構表示為:
data是數據域,parent是指針域
例如:
可表示為:
r=0,n=10.(根結點位置和結點個數)
這樣的存儲結構,根據結點parent指針很容易找到它的雙親結點,所用時間復雜度為O(1),直到parent為-1時,找到了樹的根結點,但是我們要知道結點的孩子是什么,對不起,請遍歷整個結構才行。
所以雙親表示法特點是:找雙親容易,找孩子難。
結點結構:
typedef struct PTNode{int data;int parent;//雙親位置域 }PTNode;樹結構定義:
#define MAX_TREE_SIZE 100 typedef struct{PTNode nodes[MAX_TREE_SIZE];int r,n;//根結點的位置和結點個數 }PTree;我們可以把結點擴展來解決找孩子結點的問題,但存儲結構的設計是一個非常靈活的過程。一個存儲結構設計的是否合理,取決于基于該存儲結構的運算是否適合、是否方便,時間復雜度好不好等等。
二、孩子表示法(孩子鏈表)
具體辦法是:把每個結點的孩子結點排列起來,看成是一個線性表,以單鏈表作存儲結構,則n個結點有n個孩子鏈表(葉子結點的孩子鏈表為空),然后n個頭指針又組成一個線性表,采用順序存儲結構,存放進一個一維數組中,如圖所示
為此,設計兩種結點結構,一個是孩子鏈表的孩子結點:
child是數據域,用來存儲某個結點在表頭數組中的下標,next為指針域,存儲指向某結點的下一個孩子結點的指針。
另一個是表頭數組的表頭結點,也就是雙親結點:
其中,data是數據域,firstchild是頭指針域,存儲該結點的孩子鏈表的頭指針。
孩子表示法的結構定義代碼:
孩子結點結構
typedef struct CTNode{//孩子結點int child;struct CTNode *next; }*ChildPtr;表頭結構(雙親結構)
typedef struct //表頭結構 { int data;ChildPtr firstchild; }CTBox;//孩子鏈表樹結構:
#define MAX_TREE_SIZE 100 typedef syruct //樹結構 {CTBox nodes[MAX_TREE_SIZE];//結點數組int n,r;//結點數和根結點的位置 }CTree;特點:找孩子易,找雙親難
這樣的結構對于我們要查找某個結點的某個孩子,或者找某個結點的兄弟,只需要查找這個結點的孩子單鏈表即可。對于遍歷整棵樹也是很方便的,對頭結點的數組循環即可。
但是,要找雙親結點卻很麻煩,我們可以把雙親表示法和孩子表示法綜合一下,稱為雙親孩子表示法,算是孩子表示法的改進。
我們在表頭結構中新增加一個成員即可,存儲雙親下標。為了多存儲雙親,操作方便,我們犧牲了空間。
三、孩子兄弟表示法(二叉樹表示法、二叉鏈表表示法)
任意一棵樹,它的結點的第一個孩子如果存在就是唯一的,它的右兄弟如果存在也是唯一的。因此,我們用二叉鏈表作樹的存儲結構,鏈表中每個結點的兩個指針域分別指向第一個孩子結點和此結點的下一個兄弟結點
,根結點沒有兄弟,置為空。
結點結構如表:
畫的有些丑,將就著看哈~(最右邊是nextsibling,寫錯了)
舉例:
這種表示法,給查找某個結點的某個孩子帶來方便,當然想找到結點的雙親,這個表示法也是有缺陷的,所以真的有必要的話,完全可以再增加一個parent指針域來解決快速查找雙親的問題,大家試試吧
此表示法的最大好處就是把一棵復雜度的樹變成了一顆二叉樹。
四、森林(樹)和二叉樹的轉換
1)將樹轉化為二叉樹進行處理,利用二叉樹的算法來實現對樹的操作
2)由于樹和二叉樹都可以用二叉鏈表作存儲結構,則以二叉鏈表作媒介可以導出樹與二叉樹之間的一個對應關系。
將森林轉換成二叉樹
1)加線:在兄弟之間加一連線
2)抹線:對每個結點,除了其左孩子外,去除其與其余孩子之間的關系
3)旋轉:以樹的根結點為軸心,將整數順時針轉45度。
記憶口訣:兄弟相連留長子
過程如下:加線->抹線->旋轉
將二叉樹轉換為森林
步驟:
1)加線:若p結點是雙親結點的左孩子,則將p的右孩子,右孩子的右孩子… …沿著分支找到所有的右孩子,都與p的雙親用線連起來
2)抹線:抹掉原二叉樹中雙親與右孩子之間的連線
3)調整:將結點按層次排列,形成樹結構
記憶口訣:左孩右右連雙線,去掉原來右孩線
過程如下:加線->抹線->調整(旋轉)
內容參考:
《數據結構》嚴蔚敏
總結
以上是生活随笔為你收集整理的双亲表示法、孩子表示法、孩子兄弟表示法(二叉树表示法),森林和二叉树的转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: unity 3d游戏开发_使用Unity
- 下一篇: 8、spss做因子分析及主成分分析