樹,森林,二叉樹的互相轉換
1.樹、森林到二叉樹的轉換
(1)將樹轉換為二叉樹
樹中每個結點最多隻有一個最左邊的孩子(長子)和一個右鄰的兄弟。按照這種關係很自然地就能將樹轉換成相應的二叉樹:
①在所有兄弟結點之間加一連線;
②對每個結點,除了保留與其長子的連線外,去掉該結點與其它孩子的連線。
【例】下面(a)圖所示的樹可轉換為(c)圖所示的二叉樹。
注意:
由於樹根沒有兄弟,故樹轉化為二叉樹後,二叉樹的根結點的右子樹必為空。
2)將一個森林轉換為二叉樹
具體方法是:
① 將森林中的每棵樹變為二叉樹
② 因為轉換所得的二叉樹的根結點的右子樹均為空,故可將各二叉樹的根結點視為兄弟從左至右連在一起,就形成了一棵二叉樹。
【例】下圖中,左邊包含三棵樹的森林可轉換為右邊的二叉樹。
2.二叉樹到樹、森林的轉換
把二叉樹轉換到樹和森林自然的方式是:若結點x是雙親y的左孩子,則把x的右孩子,右孩子的右孩子,…,都與y用連線連起來,最後去掉所有雙親到右孩子的連線。
【例】下圖的森林就是由例2中二叉樹轉換成的。
截圖一的題中題設為:將森林轉換為對應的的二叉樹,在二叉樹中,結點u是結點v的父結點的父結點,則在原來的森林中,u和v可能具有的關係:Ⅰ父子關係:成立;以圖為例:
Ⅱ兄弟關係:成立;以圖為例:
Ⅲu的父結點與v的父結點是兄弟關係:不成立;理由如下:
①將森林轉換為二叉樹第一步是將每棵樹轉變為二叉樹:則第一步是在所有兄弟結點之間加一連線,第二步對每個結點,除保留與長子的連線,去掉該結點與其它孩子的連線;則若u父親與v父親是兄弟關係,必連線成為父子,由此u至多為v的父親的兄弟;
②由上一步知道轉換所得的二叉樹的根結點的右子樹均空,將各二叉樹根結點視為兄弟從左至右連一起,在此有個疑問,視為兄弟,但其實沒關係的吧。即使u和v都是長子,關係仍舊如①;
③反著來,已知在二叉樹中u是v的父結點的父結點,根據森林演化成為二叉樹的條件和性質,u和v的關係可以是父子、兄弟,但無法成為u的父親與v的父親是兄弟的尷尬關係。
相關推薦
樹和二叉樹的轉換,森林和二叉樹的轉化
樹具有二叉連結串列的形式,可以將其他形式的樹轉化為二叉連結串列的形式。並且森林合併樹也是基於二叉連結串列形式的樹進行合併的。下面給出程式碼: /** * @Title: CTree.java * @Package tree * @Description
資料結構與演算法12-樹、森林與二叉樹的轉換
樹和森林的二叉樹轉換 對於樹來說,在滿足樹的條件下可以是任意開頭,一個結點可以有任意多個孩子,顯然對樹的處理要複雜得多,去研究關於樹的性質和演算法,真的不容易。有沒有簡單的方法來處理樹呢?當然有啦~ 前面我們提到過的樹的孩子兄弟法可以將一棵樹用二叉連結串列進行儲存,所以藉助二叉連結串列,樹和
樹、森林與二叉樹的相互轉換
eight inf http 轉換 alt 森林 技術分享 分享 相互 樹、森林與二叉樹的相互轉換
樹、森林與二叉樹的轉換總結
前言: 在樹這一塊的資料結構中最重要的就是二叉樹,但是對於我們大部分人來說二叉樹的基礎掌握還是ok的,但是有時候我們也會忽略了樹於森林(本人就是忽略了),今天就在這裡總結總結數、森林與二叉樹的轉換
樹、森林和二叉樹的轉換
樹轉換為二叉樹 (1)加線。在所有兄弟結點之間加一條連線。 (2)去線。樹中的每個結點,只保留它與第一個孩子結點的連線,刪除它與其它孩子結點之間的連線。 (3)層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。(注意第一個孩子是結點的左孩子
資料結構——樹、森林與二叉樹的轉換
在介紹樹的儲存結構時,就說到了樹的孩子兄弟表示法可以將一棵樹用二叉連結串列進行儲存,所以藉助二叉連結串列,樹和二叉樹可以互相轉換。從物理結構上來看,它們的二叉連結串列也是相同的,只是介紹不太一樣而已。因此,只要我們設定一定的規則,用二叉樹來表示樹,甚至表示森林都
樹、森林與二叉樹的轉換
由於二叉樹和樹都可以用二叉連結串列作為儲存結構,則以二叉連結串列作為媒介可以匯出樹與二叉樹的一個對應關係,即給定一棵樹,可以找到唯一的一顆二叉樹與之對應。從物理結構上看,樹的孩子兄弟表示法語二叉樹的二叉連結串列表示法相同,即每個結點共有兩個指標,分別指向結點
樹、森林與二叉樹相互轉化
1、樹轉換為二叉樹由於二叉樹是有序的,為了避免混淆,對於無序樹,我們約定樹中的每個結點的孩子結點按從左到右的順序進行編號。將樹轉換成二叉樹的步驟是:(1)加線。就是在所有兄弟結點之間加一條連線;(2)抹線。就是對樹中的每個結點,只保留他與第一個孩子結點之間的連線,刪除它與其它孩子結點之間的連線;(3)旋轉。就
給定一個二叉樹,獲取該二叉樹的寬度深度
prototype %d param unsigned right idt height push signed 題目: Description 給定一個二叉樹,獲取該二叉樹的寬度深度。 Prototype int GetBiNo
已知二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列
iostream code tor data- span main ast avi dsm 題目描寫敘述 輸入二叉樹的先序遍歷序列和中序遍歷序列,輸出該二叉樹的後序遍歷序列。 輸入 第一行輸入二叉樹的先序遍歷序列; 第二行輸入二叉樹的中序遍歷序列。 輸出 輸出該二叉樹的
劍指offer系列——刪除連結串列中重複的結點,二叉樹的下一個結點,對稱的二叉樹
刪除連結串列中重複的結點 題目描述 在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->5 解題思路:
C語言根據前序遍歷和後續遍歷還原二叉樹,並輸出二叉樹的高度
7-23 還原二叉樹 (25 point(s)) 給定一棵二叉樹的先序遍歷序列和中序遍歷序列,要求計算該二叉樹的高度。 輸入格式: 輸入首先給出正整數N(≤50),為樹中結點總數。下面兩行先後給出先序和中序遍歷序列,均是長度為N的不包含重複英文字母(區別大小寫)的字串
資料結構實驗-C語言-二叉樹的建立,前、中、後序遍歷的遞迴演算法和非遞迴演算法,求葉子結點數目,求二叉樹深度,判斷二叉樹是否相似,求二叉樹左右子樹互換,二叉樹層序遍歷的演算法,判斷二叉樹是否是完全二叉樹
1.實驗目的 熟練掌握二叉樹的二叉連結串列儲存結構的C語言實現。掌握二叉樹的基本操作-前序、中序、後序遍歷二叉樹的三種方法。瞭解非遞迴遍歷過程中“棧”的作用和狀態,而且能靈活運用遍歷演算法實現二叉樹的其它操作。 2.實驗內容 (1)二叉樹的二叉連結串列的建立 (2)二叉樹的前、中、後
java由先根中根遍歷序列建立二叉樹,由標明空子樹建立二叉樹,有完全二叉樹順序儲存結構建立二叉鏈式儲存結構
//由先根和中根遍歷建立二叉樹 public class bitree{ public bitree(String preorder,String inorder,int preindex,int in
劍指offer:輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 //後續遍歷二叉樹,遍歷過程中求子樹高度,判斷是否平衡 class Solution { public: bool IsBalanced(TreeNode *root, int & dep){
已知二叉樹的中序遍歷結果和(先序或後序結果),還原建立二叉樹
主函式 int main(int argc, char** argv){ int n, m; cin>>n; for(int i=0;i<n;i++){ cin>>m; v.push_back(m); } for(
Java程式碼 給出一個二叉樹和一個數,判斷該二叉樹是否存在一個從根節點到葉節點的和與給出的數相同
從菜鳥到大牛一定要戒驕戒躁,沉下心來慢慢打磨自己! 這個題目的演算法思想分為三種情況: case1樹為空時,返回false case2 樹只有一個根節點 case3 正常情況下的樹 Java程式碼如下: /** * Definition for a binary tree
已知二叉樹的前序和中序遍歷,構建該二叉樹
// 前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6} public TreeNode reConstructBinaryTree(int[] pre, int[] in) { if (pre == null || in == null
輸入某二叉樹的前序遍歷和中序遍歷的結果,重建該二叉樹
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 思路: 先序遍歷的第一個元素為根節點,在中序遍歷中找到這個根節點,從而可以將中序遍歷分為左右兩個部分,左邊部分為左子樹的中序遍歷,右
輸入某二叉樹的前序遍歷和中序遍歷的結果,重建此二叉樹。
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 比如我們知道一二叉