二叉樹的主要儲存方式是鏈結儲存,標準儲存結構也稱為二叉鍊錶。
二叉鍊錶結點類的定義
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 ...
二叉樹的建立,遍歷,查詢,刪除,插入,修改
宣告 本人正在學習資料結構與演算法,上述觀點為個人學習中的一些體會,思路不周之處,難免會有一些謬誤,若那位大神發現有問題的地方,望不吝指教。二叉樹的常規操作總結為 建立,遍歷,查詢,刪除,插入,修改。以下是本人在學習二叉樹時的,對各種操作的學習體會 二叉樹的建立方法 遞迴,非遞迴。建立方法不存在前中...
(二叉樹)二叉搜尋樹的查詢 插入和刪除
二叉搜尋樹或者是一棵空樹,或者是具有下列性質的二叉樹 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值 它的左 右子樹也分別為二叉搜尋樹。二叉搜尋樹的特點之一即是其中序遍歷為公升序。根據二叉搜尋樹的性質,每個結點的值都是大於其...