樹是一種重要的資料結構,關於樹的基本概念,如根結點、子結點、樹高等,我們不難根據名字理解其定義,因此我們不再過多介紹。下面我們來看看二叉樹,並為二叉查詢樹的引入進行準備。
二叉樹是每個結點最多有兩個子樹的樹。此外,如果每個非葉子結點的的結點都有兩個子結點,那麼這樣的二叉樹為滿二叉樹。如果乙個二叉樹的全部結點都滿足:乙個結點有右子結點,那麼這個結點一定有左子結點,那麼這個二叉樹為完全二叉樹。
下面給出三個例子,它們分別是滿二叉樹和兩個完全二叉樹。
從上述三個二叉樹中我們不難發現乙個完全二叉樹有乙個奇妙的性質:若乙個二叉樹的父結點為k,那麼它左子結點為2k,右子結點為2k+1。如果乙個子結點的編號是k,那麼其父結點編號為k/2。
這種奇妙的性質給了我們一種很好的方法去模擬乙個完全二叉樹:陣列。data[1]為根結點,左子結點為data[2],右子結點為data[3]……這樣下去,我們就能通過陣列的下標來表示這個樹的關係。這樣對所有二叉樹都適用,對於不存在的結點,只要標記其對應的陣列元素即可。但是,若如此做,會浪費大量的空間。因此我們在這裡不實現這種方法。
下面我們介紹二叉查詢樹的定義:
1.若左子樹不空,則左子樹上所有結點的值均小於它的根結點的值;
2.若右子樹不空,則右子樹上所有結點的值均大於它的根結點的值;
3.左、右子樹也分別為二叉排序樹;
4.沒有鍵值相等的結點。
不難發現,二叉查詢樹是將所有元素「劈成」兩半,按照大小的順序擺放好位置,提高了二叉樹的有序程度。因此它也有著更高的效率。今天我們嘗試建立乙個二叉查詢樹。
首先來定義乙個結構體,表示出每乙個結點所需要的資料。
typedef
struct node
node,
*ptrnode;
接下來是定義乙個create函式,這裡應當是不難理解的。
ptrnode create
(int data)
此外,我們還需要乙個向這個二叉查詢樹中新增結點的函式。
void
addnode
(ptrnode ptr,
int data)
else
//如果有左子樹,那麼遞迴地繼續查詢,直到找到沒有子結點的,關於此資料的正確的位置
}else
//在資料大於該結點的情況下,放入右子樹,下述內容與放入左子樹的過程類似
else
}}
在完成了這兩個函式之後,我們可以嘗試輸入自己的資料建立乙個二叉查詢樹。
int
main()
return0;
}
當然,現在的我們建立完這個二叉查詢樹後什麼都不能做,下一次我們會介紹查詢元素、刪除元素、求樹高和遍歷元素等操作。 演算法導論(5) 二叉搜尋樹
二叉搜尋樹 設x是二叉搜尋樹的乙個結點,如果y是x左子樹的乙個結點,那麼y.key x.key,如果y是x有字數的乙個結點,那麼y.key x.key。二叉樹有三種遍歷的方法 先序遍歷 輸出根的關鍵字在其左右子樹的關鍵字之前。中序遍歷 輸出根的關鍵字在其左右子樹的關鍵字之間。後序遍歷 輸出根的關鍵字...
二叉搜尋樹 二叉搜尋樹
題目 二叉搜尋樹 time limit 2000 1000 ms j a others memory limit 32768 32768 k j a others total submission s 6945 accepted submission s 3077 problem descripti...
二叉搜尋樹 修剪二叉搜尋樹
第一反應是重構,看來別人的解答發現,其實不用重構那麼複雜。treenode trimbst treenode root,int low,int high if root val high 下一層處理完左子樹的結果賦給root left,處理完右子樹的結果賦給root right。root left ...