樹結構用什麼存儲結構
㈠ 二叉樹的兩種物理結構是什麼
答:二叉樹就物理結構來分可以分成:順序存儲結構和鏈式存儲結構。
(1)順序存儲結構:
順序存儲結構,顧名思義就是二叉樹的數據元素存放在一組連續的存儲單元中。其主要有一下幾個特點:
①邏輯上相鄰的兩個元素在物理位置上也是相鄰的;
②操作刪除和插入的時候,需要整體移動元素;
③需要預先分配空間,不能動態增長;
(2)鏈式存儲結構:
鏈式存儲結構中二叉樹的每個結點至少包含三個域:數據域、左指針域和右指針域。其二叉樹是通過指針實現,鏈式存儲結構有以下幾個特點:
①邏輯上相鄰的兩個元素在物理位置上不一定是相鄰的;
②操作刪除和插入的時候,不需要整體移動元素;只需要修改相應的指針即可;
③不需要預先分配空間;
④存儲指針本身會消耗一定的存儲的空間;
㈡ 樹 - 二叉樹 - 二叉樹的存儲結構(二)
鏈式存儲結構
結點的結構
二叉樹的每個結點最多有兩個孩子 用鏈接方式存儲二叉樹時 每個結點除了存儲結點本身的數據外 還應設置兩個指針域
lchild和rchild 分別指向該結點的左孩子和右孩子 結點的結構為
結點的類型說明
typedef char DataType; //用戶可根據具體應用定義DataType的實際類型
typedef struct node{
DataType data;
Struct node *lchild *rchild; //左右孩子指針
}BinTNode; //結點類型
typedef BinTNode *BinTree;//BinTree為指向BinTNode類型結點的指針類型
二叉鏈表(二叉樹的常用鏈式存儲結構)
在一棵二叉樹中 所有類型為BinTNode的結點 再加上一個指向開始結點(即根結點)的BinTree型頭指針(即根指針)root 就構
成了二叉樹的鏈式存儲結構 並將其稱為二叉鏈表
【例】下面左圖所示二叉樹的二叉鏈表如下面中圖所示
注意
① 一個二叉鏈表由根指針root惟一確定 若二叉樹為空 則root=NULL;若結點的某個孩子不存在 則相應的指針為空
② 具有n個結點的二叉鏈表中 共有 n個指針域 其中只有n 個用來指示結點的左 右孩子 其餘的n+ 個指針域為空
帶雙親指針的二叉鏈表
經常要在二叉樹中尋找某結點的雙親時 可在每個結點上再加一個指向其雙親的指針parent 形成一個帶雙親指針的二叉鏈表
【例】上面右圖是上面左圖所示的二叉樹的帶雙親指針的二叉鏈表
注意
二叉樹存儲方法的選擇 主要依賴於所要實施的各種運算的頻度
lishixin/Article/program/sjjg/201311/23885
㈢ 樹的存儲結構
樹的存儲結構與遍歷
樹的存儲結構主要有三種方式:雙親表示法、孩子表示法和孩子兄弟表示法。
1. 雙親表示法通過數組結構存儲,如PTree類型,每個結點包含數據和指向雙親的索引。例如,MAX-TREE-SIZE定義了最大結點數,每個結點如PTNode所示。
2. 孩子表示法通過鏈表結構存儲,如CTree類型,每個結點包含指向孩子和下一個兄弟的指針。雙親與孩子鏈表頭指針結合,如CTBox結構。
3. 孩子兄弟表示法,每個結點有firstchild和nextsibling,如CSNode和CSTree,用於表示二叉樹或二叉鏈表。
對於樹的遍歷,先根序和後根序是兩種基本方法,森林的遍歷則是基於樹的遍歷,包括先序遍歷和中序遍歷。
森林與二叉樹之間的轉換有自然轉換法,如將森林轉換為二叉樹時,連接兄弟節點並調整連線方向,反之,將二叉樹轉換為森林則需要連接相關節點並去掉多餘的連線。