二叉樹的遍歷 查詢 插入以及刪除

2021-07-12 00:45:48 字數 1545 閱讀 2926

二叉樹的主要儲存方式是鏈結儲存,標準儲存結構也稱為二叉鍊錶。

二叉鍊錶結點類的定義

struct node;
常見的二叉樹遍歷方式下面給個例項來表示具體的遍歷方式:

前序遍歷訪問順序:訪問根結點;左子樹;右子樹。

首先訪問根結點a,然後左子樹l;因為l也採用前序遍歷的方式,則首先訪問l的左子樹b,b沒有孩子結點,接下來訪問l的右子樹,這樣以a的左子樹遍歷完畢,剩下遍歷右子樹。

對應前序遍歷順序:a-l-b-e-c-d-w-x

//前序遍歷遞迴實現

void preorder(node *t)

中序遍歷訪問順序:左子樹;訪問根結點;右子樹。

首先遍歷根結點a的左子樹,最先訪問為b-l-e,左子樹遍歷結束;接下來就是a的右子樹c,因為c沒有左子樹,根據中序遍歷順序,則訪問c,然後訪問c對應的右子樹d(注意這時並不是d,因為d還有左子樹,所以先訪問w,w的右子樹x,才輪到d)通俗一點講就相當於排隊時候本來輪到你的順序了,結果你前面那一位代替別人留了幾個位置,所以只能等待人家。

對應中序遍歷順序:b-l-e-a-c-w-x-d

後序遍歷訪問順序:左子樹;右子樹;訪問根結點。

對應後序遍歷順序:b-e-l-x-w-d-c-a

//後序遍歷遞迴實現

void postorder(node *t)

二叉樹的乙個重要應用就是查詢。這裡用到了二叉排序樹,二叉排序樹的三大基本操作:

(1)查詢find(tree,x);

二叉排序樹的查詢實現:

bool find(node *t,t x)

(2)插入insert(tree,x);

void insert(node *

&t,t x)

(3)刪除remove(tree,x);

二叉排序樹上最複雜的操作就是remove,因為樹中結點可以有兩個兒子,若刪除根結點就會將原來的樹**成三部分。

刪除操作過程:

首先比較被刪結點和根結點的值,根據比較結果分三種情況刪除。如果小於根結點,在左子樹上刪除;大於根結點,在右子樹上刪除;等於根結點,刪除根結點。在刪除根結點的時候,考慮有兩個兒子的時候,把右子樹上的最小值作為替身,刪除替身。否則,將結點的非空兒子替代被刪結點的位置,釋放被刪結點的空間。

void remove(node *

&t,t x)

else

}

jS生成二叉樹,二叉樹的遍歷,查詢以及插入

js遞迴,二叉樹的操作 遞迴演算法n次冪 function foo n else nodes 遞迴樹形節點 function output node output nodes 二叉樹 var tree right right right 二叉樹遍歷 遞迴演算法,容易導致執行棧溢位 function ...

二叉樹的建立,遍歷,查詢,刪除,插入,修改

宣告 本人正在學習資料結構與演算法,上述觀點為個人學習中的一些體會,思路不周之處,難免會有一些謬誤,若那位大神發現有問題的地方,望不吝指教。二叉樹的常規操作總結為 建立,遍歷,查詢,刪除,插入,修改。以下是本人在學習二叉樹時的,對各種操作的學習體會 二叉樹的建立方法 遞迴,非遞迴。建立方法不存在前中...

(二叉樹)二叉搜尋樹的查詢 插入和刪除

二叉搜尋樹或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉搜尋樹。二叉搜尋樹的特點之一即是其中序遍歷為公升序。根據二叉搜尋樹的性質,每個結點的值都是大於其...