1. 程式人生 > >資料結構——樹、森林與二叉樹的轉換

資料結構——樹、森林與二叉樹的轉換

在介紹樹的儲存結構時,就說到了樹的孩子兄弟表示法可以將一棵樹用二叉連結串列進行儲存,所以藉助二叉連結串列,樹和二叉樹可以互相轉換。從物理結構上來看,它們的二叉連結串列也是相同的,只是介紹不太一樣而已。因此,只要我們設定一定的規則,用二叉樹來表示樹,甚至表示森林都是可以的,森林和二叉樹也可以互相進行轉換。

樹轉換為二叉樹

將樹轉換為二叉樹的步驟如下:

  1. 加線:在所有的兄弟結點之間加一條連線;
  2. 去線:對樹中的每個結點,只保留它與第一個孩子結點的連線,刪除它與其他孩子結點之間的連線;
  3. 層次調整:以樹的根結點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。注意第一個孩子是二叉樹結點的左孩子,兄弟轉換過來的孩子是結點的右孩子。

這裡寫圖片描述

森林轉換為二叉樹

森林是由若干棵樹組成的,所以可以完全理解為,森林中的每一棵樹都是兄弟,可以按照兄弟的處理辦法來操作。步驟不如:

  1. 把每棵樹轉換為二叉樹;
  2. 第一棵二叉樹不動,從第二棵二叉樹開始,依次把後一棵二叉樹的根結點作為前一刻二叉樹的根結點的右孩子,用線連線起來。當所有的二叉樹連線起來後就得到了由森林轉換來的二叉樹。

這裡寫圖片描述

二叉樹轉換為樹

二叉樹轉換為樹是樹轉換為二叉樹的逆過程,也就是反過來做而已。

  1. 加線:若某結點的左孩子結點存在,則將這個左孩子的右孩子結點、右孩子的右孩子結點…就是左孩子的n個右孩子結點都作為此結點的孩子。將該結點與這些右孩子結點用線連線起來;
  2. 去線:刪除原二叉樹中所有結點與其右孩子結點連線;
  3. 層次調整:使之結構層次分明。

這裡寫圖片描述

二叉樹轉換為森林

判斷一棵二叉樹能夠轉換為一棵樹還是森林,標準很簡單,那就是隻要看這棵二叉樹的根結點有沒有右孩子,有的就是森林,沒有的就是一棵樹。二叉樹轉換為森林步驟如下:

  1. 從根結點開始,若右孩子存在,則把與右孩子結點的連線刪除,再檢視分離後的二叉樹,若右孩子存在,則連線刪除…直到所有右孩子連線都刪除為止,得到分離的二叉樹;
  2. 再將每一個二叉樹轉換為樹即可。

這裡寫圖片描述

樹、森林看似複雜,其實它們都可以轉換為二叉樹來處理,我們研究了樹、森林和二叉樹的互相轉換的辦法,這樣就使得面對樹和森林的資料結構時,編碼實現稱為了可能。

更多精彩內容,歡迎關注我的微信公眾號——Android機動車

這裡寫圖片描述

相關推薦

資料結構演算法12-森林轉換

樹和森林的二叉樹轉換 對於樹來說,在滿足樹的條件下可以是任意開頭,一個結點可以有任意多個孩子,顯然對樹的處理要複雜得多,去研究關於樹的性質和演算法,真的不容易。有沒有簡單的方法來處理樹呢?當然有啦~ 前面我們提到過的樹的孩子兄弟法可以將一棵樹用二叉連結串列進行儲存,所以藉助二叉連結串列,樹和

資料結構——森林轉換

在介紹樹的儲存結構時,就說到了樹的孩子兄弟表示法可以將一棵樹用二叉連結串列進行儲存,所以藉助二叉連結串列,樹和二叉樹可以互相轉換。從物理結構上來看,它們的二叉連結串列也是相同的,只是介紹不太一樣而已。因此,只要我們設定一定的規則,用二叉樹來表示樹,甚至表示森林都

森林的相互轉換

eight inf http 轉換 alt 森林 技術分享 分享 相互 樹、森林與二叉樹的相互轉換

森林轉換總結

前言:   在樹這一塊的資料結構中最重要的就是二叉樹,但是對於我們大部分人來說二叉樹的基礎掌握還是ok的,但是有時候我們也會忽略了樹於森林(本人就是忽略了),今天就在這裡總結總結數、森林與二叉樹的轉換

森林轉換

由於二叉樹和樹都可以用二叉連結串列作為儲存結構,則以二叉連結串列作為媒介可以匯出樹與二叉樹的一個對應關係,即給定一棵樹,可以找到唯一的一顆二叉樹與之對應。從物理結構上看,樹的孩子兄弟表示法語二叉樹的二叉連結串列表示法相同,即每個結點共有兩個指標,分別指向結點

森林相互轉化

1、樹轉換為二叉樹由於二叉樹是有序的,為了避免混淆,對於無序樹,我們約定樹中的每個結點的孩子結點按從左到右的順序進行編號。將樹轉換成二叉樹的步驟是:(1)加線。就是在所有兄弟結點之間加一條連線;(2)抹線。就是對樹中的每個結點,只保留他與第一個孩子結點之間的連線,刪除它與其它孩子結點之間的連線;(3)旋轉。就

資料結構學習筆記-森林的轉化最優

int min(HuffmanTree &HT,int i) { int k = MAX; int j,flag = 0; for(j=1;j<=i;++j) { if(HT[j].weights2) { change = s1; s1 = s2; s2 = chang

資料結構:二分查詢

關於二分查詢,原理其實不難,而且java Arrays類裡面有一個sorts()方法,可以先對資料進行排序,然後呼叫binarySerarch()方法,這個方法就是進行二分查詢用的。 下面是JDK的原始碼: private static int binarySe

森林轉換

樹轉換為二叉樹 (1)加線。在所有兄弟結點之間加一條連線。 (2)去線。樹中的每個結點,只保留它與第一個孩子結點的連線,刪除它與其它孩子結點之間的連線。 (3)層次調整。以樹的根節點為軸心,將整棵樹順時針旋轉一定角度,使之結構層次分明。(注意第一個孩子是結點的左孩子

SDUTOJ1291資料結構上機測試4.1:的遍歷應用1

以SDUTOJ1291資料結構上機測試4.1:二叉樹的遍歷與應用1為例 https://acm.sdut.edu.cn/onlinejudge2/index.php/Home/Contest/contestproblem/cid/2711/pid/1291 思路: 遞迴實現,化解子問

資料結構中常見的(BST搜尋AVL平衡RBT紅黑B-B+B*

BST樹 即二叉搜尋樹:        1.所有非葉子結點至多擁有兩個兒子(Left和Right);        2.所有結點儲存一個關鍵字;        3.非葉子結點的左指標指向小於其關鍵字的子樹,右指標指向大於其關鍵字的子樹; 如:      

郝斌資料結構入門--P75-鏈式具體遍歷程式演示

郝斌資料結構入門--P75-鏈式二叉樹具體遍歷程式演示   知道遞迴的實現與應用,二叉樹的遍歷就容易了。   程式碼如下: #include <stdio.h> #include <malloc.h> struct BTNode {

資料結構實驗四順序表

#include<iostream> #include<string> #define MaxSize 100 using namespace std; class Tree {private: string array[100];

軟考:資料結構基礎——建立順序完全

  首先是關於樹,二叉樹,完全二叉樹的一些知識 一、樹     (一)、基本概念            1. 度:一個節點的子樹的個數    &

資料結構(四)之

二叉樹 二叉樹可以用陣列和鏈式結構這兩種方式來建立,這裡只介紹二叉樹的鏈式結構,並且實現二叉樹的前序、中序和後序遍歷。(運用二叉樹組定義靜態二叉樹的方式以註釋的形式寫明) 二叉樹的建立有三種方式:前序、中序和後序。這裡只展現了前序遍歷的方式。 #include<

資料結構知識整理 - 遍歷的應用

主要內容 建立二叉連結串列 複製二叉樹 計算二叉樹深度 統計二叉樹的結點個數   建立二叉連結串列 在先序遍歷的遞迴演算法中,將輸出語句改為輸入語句即可。(可回顧“遞迴演算法”) 需要注意的是,遞迴演算法會遍歷滿二叉樹中的每一個結點,

資料結構-劍指offer-把列印成多行

題目:從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。因為要按層列印,首先想到的是層次遍歷。在二叉樹的深度這道題中,首先應用到了層次遍歷。每一層的節點值存入一個小vector c,再把小vector c存到大vector vec中,列印vec。(題目沒有要求換

資料結構)第五章

二叉樹 資料結構大致分為兩種型別:基於陣列的實現和基於連結串列的實現。 兩種結構的特點: 基於陣列的實現:通過下標或秩,在常數時間內找到目標物件。插入和刪除,需要耗費線性時間。 基於連結串列的實現:藉助引用或位置物件,在常數時間內插入或刪除元素。但需要線性時間,對整個結構進行遍歷查詢

[資料結構]實驗五_順序

#include<iostream> using namespace std; class SeqBinaryList { public: //T init(); SeqBinaryList() {} //~SeqBinaryList(); void

資料結構和演算法之美-(上)

學習筆記 “樹”這種資料結構的形態特徵 包括有哪些命名節點和它們的概念,這些節點是根節點,葉子節點,父節點,子節點,兄弟節點等;以及相關節點關係的建立,這些關係是父子關係和兄弟關係 “樹"這種資