演算法與資料結構 樹

2021-10-08 01:46:40 字數 3202 閱讀 9925

搜尋

如上圖所示:圓圈代表結點,連線結點的線代表邊。樹由結點和連線結點的邊組成。

2、有根結點的父子關係:如圖根結點為0,連線根結點0到結點4最後一條邊連線著結點1和4,則結點1稱為結點4的父節點,結點4 為結點1 的子節點。結點2,3為結點4的兄弟結點。

3、根結點:沒有父節點的結點(唯一)

外部結點(葉結點):沒有子節點的結點(如4,5)

內部結點:除葉節點以外的結點

結點度、高、深度

1、結點的度:乙個結點擁有的子節點總數稱為結點的度(如節點2,有三個子節點,則節點2的度為3);

2、結點的深度:根結點到某一節點(x)的路徑的長度稱為 結點x 的深度(如節點2,根結點到2 只經過一條邊,則x的深度為1);

3、結點的高:某一節點(x)到子結點的最大路經長稱為結點x的高(如節點2,到子節點11(12)路徑最長,高度位2)

一顆數的根結點的高度最大,(如節點8,其深度為2,高為1,樹高為3)

二叉樹1、概念:擁有乙個根結點,且其他結點的子結點數都不超過2。

2、有序樹:在二叉樹中,每個結點的子節點數不超過2個,而且還分左節點和右節點,像這種子節點有特定順序的樹稱為有序樹。

// 二叉樹的表達

//輸入結點個數n,每個結點資訊,id(結點編號)left(左子結點編號)

right(右子結點編號。

//輸出node:id :parent = p,sibling = s,degree = deg (度)

,depth = dep(深度),height = h(高),

type(結點型別(根,葉或者內結點)

#include 

#define max

10000

#define nil-1

using namespace std;

typedef struct node

node;

node t

[max];

int n,d

[max],

h[max]

;int getheight

(int u)if(

t[u]

.right !=

nil)

h[u]

=max

(h1,h2)

;return

h[u];}

void

getdepth

(int u, int d)if(

t[u]

.right!=

nil)

}int getsibling

(int u)if(

t[t[u]

.parent]

.left!=u &&t[

t[u]

.parent]

.left!=

nil)if(

t[t[u]

.parent]

.right!=u &&t[

t[u]

.parent]

.right!=

nil)

return

nil;

}void

print

(int u)

int main()

for(int i=

0;i<

n;i++

)for

(int i=

0;i<

n;i++

)getdepth

(root,0)

;getheight

(root)

;for

(int i=

0;i<

n;i++

)return0;

}

樹的遍歷

1、前序遍歷:按照根結點、左子樹、右子樹的順序輸出結點編號。

下面展示一些內聯**片

// 前序,先訪問u,列印出結點u,然後執行preparse(t[u].left)

訪問u的左子樹,處理完畢再執行preparse(t[u].right)訪問u的右子樹,

u=nil時沒有後續結點,函式結束。其他兩種只是列印順序的調整

void

preparse

(int u)

2、中序遍歷:按照左子樹、根結點、右子樹的順序輸出結點編號。

void

inparse

(int u)

inparse(t

[u].left)

; cout<" ";

inparse(t

[u].right)

;}

3、後續遍歷:按照左子樹、右子樹、根結點的順序輸出結點編號。

void

postparse

(int u)

postparse(t

[u].left)

;postparse(t

[u].right)

; cout<" ";

}

樹的重建

比如當我們知道乙個樹的前序排列,中序排列,讓我們來求這個數的後序排列,這其實就是一種樹的重建。

下面這段**就是根據已知的前序,中序排列,求樹的後序排列。

//前序排列為1 2 3 4 5 6 7 8 9

//中序排列為3 2 5 4 6 1 8 7 9

//先遍歷前序排列,當前結點為c,然後可以通過查詢結點c在in中的位置m,

m的左邊就是c的左子樹,右邊就是c的右子樹,然後一步一步找下去。

void

reconstruction

(int left,int right)

int root =

pre(pos++);

int m =

distance(in

.begin()

,find(in

.begin()

,in.end()

,root));

reconstruction

(left,m)

;reconstruction

(m+1

,right)

; post.

push_back

(root)

;}

資料結構與演算法 樹

後序遍歷 已知前序和中序求後序 設計 的原則 1 有且僅有乙個根節點 2 所有的子樹也滿足該要求 子樹之間不能有交集 單個節點也是一棵樹 空樹 啥資料都沒有,沒有任何節點 根節點 父節點,子節點,兄弟節點 如果兩個節點的父節點雖不相同,但是它們的父節點處在同一層次上,那麼這兩個節點是兄弟節點 葉子節...

資料結構與演算法(樹)

1 樹的定義 2 基本術語 3 樹的性質 1 二叉樹定義及特性 2 二叉樹的儲存結構 1 二叉樹遍歷 1 樹的儲存結構 2 樹 森林 二叉樹的轉換 樹轉換為二叉樹的規則 每個節點左指標指向它的第乙個孩子,右指標指向它在樹種的相鄰右兄弟。根節點沒有兄弟,所以對應二叉樹沒有右子樹。樹轉換為二叉樹的方法 ...

資料結構與演算法 樹 B樹

概述 b樹也稱b 樹。b樹中所有結點中孩子結點個數的最大值成為b樹的階,通常用m表示,從查詢效率考慮,一般要求m 3。一棵m階b樹或者是一棵空樹,或者是滿足以下條件的m叉樹。定義 b樹是一種平衡的多分樹,通常我們說m階的b樹,它必須滿足如下條件 根結點至少有兩個子女。每個中間節點都包含k 1個元素和...