資料結構與演算法 樹

2021-10-05 23:06:27 字數 4091 閱讀 4794

後序遍歷

已知前序和中序求後序

設計**的原則

(1)有且僅有乙個根節點

(2)所有的子樹也滿足該要求

子樹之間不能有交集

單個節點也是一棵樹

空樹:啥資料都沒有,沒有任何節點

根節點

父節點,子節點,兄弟節點(如果兩個節點的父節點雖不相同,但是它們的父節點處在同一層次上,那麼這兩個節點是兄弟節點)

葉子節點--------沒有子節點的節點

節點的度

度:對於乙個節點而言,擁有的子樹數稱為節點的度

樹的度:樹內各節點的度的最大值

層次(根節點第一層)

樹的高度(深度)

樹的高度(深度)是樹中節點所在的最大的層次

路徑:從root節點找到該節點的路線

森林:多棵子樹構成森林

二叉樹的每個節點的度最大為2(可能乙個,也可能沒有)

非空二叉樹的第i層,最多有2i-1次方個節點,i是大於等於1的

在高度為h的二叉樹上最多有2h-1個節點

所有的節點的度要麼是0,要麼都是2

所有節點的度要麼都是0 ,要麼都是2

所有的葉子節點都在最後一層滿二叉樹屬於真二叉樹

有2h-1個節點完全二叉樹從根節點到倒數第二層一定是一棵滿二叉樹滿二叉樹一定是完全二叉樹,但是完全二叉樹不一定是滿二叉樹

度為1的節點只有左子樹

度為1的節點要麼是1個,要麼是0個

最後一層的葉子節點在左邊連續同樣節點數量的二叉樹,完全二叉樹的高度最小

父節點的下標是index

那麼左節點下標:2*index+1

右節點下標:2*index+2

陣列最後乙個點的下標是i,那麼這個點的父節點的下標是(i-1)/ 2

或者陣列的長度是len,最後乙個節點的父節點下標是(len / 2)- 1

如果乙個二叉樹,很多位置都是空的,那對應的陣列位置也是空的,浪費記憶體所以不適合陣列儲存

二叉查詢樹

規定了節點上的值,左邊的都比根節點小,右邊的都比根節點大

左下角的是最小的,右下角是最大的

查詢方法:把要查詢的值與根節點的值進行比

較,小於根節點與左節點比較,大於根節點與右節點比較

維持相對順序

根節點–>左子樹–>右子樹

注:當遍歷完左子樹以後不是馬上去遍歷右子樹,而是看看左子樹是否還有左子樹

void

pre_order

(node *root)

// dlr

printf

("%d\n"

, node->data)

;pre_order

(root->left)

;pre_order

(root->right)

;}

void

preorder

(pnode root)

else

}}

左子樹–>根節點–>右子樹

二叉搜尋樹的中序遍歷為有序數列

order(root->left);

printf("%d\n", node->data);

order(root->right);

void

midorder

(pnode root)

else

}}

左子樹–>右子樹–>根節點

order(root->left);

order(root->right);

printf("%d\n", node->data);

void

backorder

(pnode root)

;int top =-1

;while

(index !=

null

|| top !=-1

)else

// index == null

else

//flagstack[top] == 2}}

}

queue *

level_order

(pnode root)

if(node->right !=

null

)addqueue

(queue2, p->data)

;//如果只需要展示,可以不需要佇列2,這句直接列印就可以了

delqueue

(queue1);if

(isemptyqueue

(queue1))}

}return

null

;}

pnode search_node

(pnode root,

int data)

if(root->data == data)

pnode node =

search_node

(root->left, data);if

(node !=

null

) node =

search_node

(root->right, data);if

(node !=

null

)return

null

;}

首先看先序,在第乙個必是樹根,然後在看中序,以剛才先序的第乙個字母為界,左邊是左子樹,右邊是右子樹,以此類推

// 這個是根的值

int a = front[0]

;// 根據中序遍歷確定左右子樹 左右樹的分割

int i =0;

while

(i < len && mid[i]

!= a)

// 左子樹的節點個數

int left_number = i;

// 右子樹的節點個數

int right_number = len - i -1;

// 遞迴建立樹

node *root =

create_node

(a);

//左邊的數再看成一顆樹,遞迴

node *left =

create_tree_from_preandmid

(&front[1]

,&mid[0]

, left_number)

;//右邊的數再看成一棵樹,遞迴

node *right =

create_tree_from_preandmid

(&front[left_number +1]

,&mid[left_number +1]

, right_number)

;link_node

(root, left, right)

;return root;

}

演算法與資料結構 樹

搜尋 如上圖所示 圓圈代表結點,連線結點的線代表邊。樹由結點和連線結點的邊組成。2 有根結點的父子關係 如圖根結點為0,連線根結點0到結點4最後一條邊連線著結點1和4,則結點1稱為結點4的父節點,結點4 為結點1 的子節點。結點2,3為結點4的兄弟結點。3 根結點 沒有父節點的結點 唯一 外部結點 ...

資料結構與演算法(樹)

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

資料結構與演算法 樹 B樹

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