樹和森林

樹的存儲結構

一 雙親表示法

使用一維數組,每一個元素有兩個域,數據域和父結點索引域node

數據結構定義:

#define	size	10
typedef	struct
{
  char data;
  int	parent;
} Node;
Node slist[size];

圖示:

image-20200610094753525

特色:

找父結點容易,找結點 的孩子麻煩,需遍歷整張表。數組

二 孩子鏈表表示法

使用一維數組存儲樹中全部節點,每一個元素有兩個域數據域和第一個孩子節點的指針域安全

孩子節點也有兩個域分別是自身對應的索引域以及下一個孩子節點的指針域數據結構

數據結構定義:

# define MAXND 20
typedef struct bnode
{int child;
    struct bnode *next;
}node,*childlink;
typedef struct
{ 
  char data;  
  childlink hp;
}headnode;
headnode link[MAXND];

圖示:

image-20200610100421170

特色:

查找子節點方便,查找父結點困難指針

雙親孩子表示法

爲了接查找父結點困難的問題,能夠在數組元素中增長一個域存儲父結點的索引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];

圖示:

image-20200610101225384

三 孩子兄弟表示法(二叉鏈表表示法)

使用鏈表存儲樹中的節點,鏈表中每一個元素有三個域分別爲第一個孩子指針域,數據域,下一個兄弟指針域索引

節點組成:class

image-20200610104808018

數據結構定義:

Typedef struct tnode
{
int data;
struct tnode *son,*brother;
}*Tree;

圖示:

image-20200610104528702

特色:

  • 數據結構定義與二叉樹的二叉鏈表表示法安全相同,可是指針所表示的含義是不一樣的二叉樹

  • 查找父結點需遍歷鏈表遍歷

樹/森林與二叉樹之間的轉換

通常樹轉換二叉樹

轉換方法:

  1. 個兄弟節點之間添加連線
  2. 對任一節點,除最左孩子以外,抹掉該節點與其餘子節點的各枝(取消連線)
  3. 以根節點爲中心,將連線順時針轉45度

圖示:

image-20200610160118557

一棵樹的孩子兄弟鏈表示法與將該樹轉爲二叉樹後的二叉鏈表表示法存儲結構徹底相同,僅節點中指針含義不一樣

設有如下樹(左),並將其轉換爲二叉樹(右):

image-20200610160545060

使用孩子兄弟表示法存儲以上樹獲得存儲結構如圖(左)

使用二叉鏈表表示法存儲轉換後的二叉樹獲得結構如圖(右)

image-20200610161225219

森林轉換二叉樹

轉換方法:

  1. 將每棵樹轉換爲對應的二叉樹
  2. 將第一步獲得的各二叉樹的根節點看做是兄弟節點,加連線,以最左側根節點做爲中心將根節點連線順時針旋轉45度

圖示:

image-20200610163705219

二叉樹還原爲通常樹

明確:根節點沒有右孩子的二叉樹可轉爲通常樹

還原方法:

  1. 從根節點起
  2. 當前節點的左孩子和左孩子右枝上的全部節點做爲當前節點的孩子節點
  3. 重複第一步

也是樹轉二叉樹的逆運算即以根節點爲中心全部節點逆時針旋轉45度

圖示:

image-20200610195745932

二叉樹還原爲森林

明確:根節點有右孩子的二叉樹可轉爲森林

還原方法:

  1. 根節點右枝上的每個節點做爲一個的根節點
  2. 將拆開後的二叉樹按二叉樹還原爲通常樹的方法轉換爲通常樹

也是森林轉二叉樹的逆運算

圖示:

image-20200610202905880

樹的遍歷

先序遍歷:先訪問根節點,而後依次先序遍歷根的每一個子樹

後序遍歷:先依次遍歷每棵子樹,最後訪問根節點

層次遍歷:從上到下從左到右依次遍歷全部節點

因爲子節點個數不肯定因此沒有沒法實現中序遍歷

示例:

image-20200610203816192

上圖對應的遍歷順序

先序:ABCDE

後序:BDCEA

層次:ABCED

樹的遍歷結果與轉爲二叉樹後的遍歷結果對應關係

樹 => 二叉樹

先序 == 先序

後序 == 中序

森林的遍歷

先序遍歷:依次使用先序遍歷森林中每棵樹

中序遍歷:對每棵樹按照先子後根的方式遍歷每一個節點

之因此叫中序: 由於 樹的後序==樹轉二叉樹的中序

示例:

image-20200610211307262

上圖對應的遍歷順序

先序:ABCDEFGHJI

中序:BCDAFEJHIG

相關文章
相關標籤/搜索