分析二叉排序樹的定義:根節點25 的左右子樹, 18左子樹的全部節點大小是小於25的,右子樹的全部節點是大於25的。
同樣46作為根節點的左右子樹也是滿足上述性質。
那麼這樣的二叉樹就是二叉排序樹。特別注意二叉排序樹裡面不存在2個相同的節點資料
那麼二叉排序樹查詢元素的過程是什麼樣的呢,其實如果你們看過我寫的二分查詢的部落格,你們會很清楚,每次查詢都是將元素查詢範圍減少1半,其實是比較類似的。因此我們的二叉排序樹查詢過程,我們可以把鍊錶形式的儲存結構看成有序的順序表儲存結構。
二叉排序樹查詢過程分析:
首先我們把根節點和需要查詢的元素k給查詢演算法,查詢演算法先得到根節點元素和需要查詢的元素比較,看看是不是想到的元素,找到話就返回當前節點的指標,
如果我們的待查詢的元素k大於當前根節點裡面的元素,那麼根據二叉排序的性質,這個待查詢節點的位置一定在當前根節點元素的右子樹裡面,不過查詢之前先判斷有沒有右子樹存在,如果沒有的話,查詢肯定就失敗了那麼就給你乙個null.否則就接著幹吧。
下面上針對二叉排序樹查詢關鍵字k的演算法
二叉排序樹節點資料型別設定
typedf strcut bstnode
// bstnode 節點資料型別 用遞迴演算法
bstnode * searchbst(bstnode *bt, int key)
else
if(bt->
data
> key)
else
}//但是一直遞迴沒有出口咋可以呢,因此啥時候結束遞迴呢 ,當父函式給我的孩子節點位址是空的時候,
//就直接退出沒有必須巡查了
//剛好**跑到這裡說明 bt == null 也就是沒有孩子了
return
null;
}
但是現實中,我們查詢的資料一定在二叉樹中嗎,你看到了可能會返回null位址,也就是沒有找到,那麼我們該怎麼辦,二叉樹裡沒有我們就不做處理了嗎,並不是,我們是把這個元素插入二叉樹中去,並且還是二叉排序樹,我們知道二叉排序樹是支援動態查詢的,什麼是動態查詢呢,比如我們查的元素不在當前集合中,我們就插入進去,那麼陣列支援動態查詢嗎,肯定不行,陣列記憶體是靜態分配的,不能進行動態分配,那麼二叉樹是鍊錶形式是支援動態分配記憶體的。
現在來談假如我們查詢的元素不在二叉樹裡面的情況,那麼我們需要往空樹裡面插入節點。
現在來實現插入演算法 用遞迴實現
//插入節點到二叉排序樹中 規則返回值1表示插入功能 0插入失敗,說明當前元素已經存在
//bt是二叉排序樹的根節點指標 key是想插入的節點元素
//bstnode是我們設計的節點資料型別
int insertbst(bstnode *bt, int key)
else
//不是空樹
else
if(bt->
data
> key) //插入節點比當前資料小 我們需要去當前節點左子樹去找位置
else}}
實際情況,可能給我們的一組數,比如乙個陣列,有上面對單個數的插入演算法,那麼實現針對陣列的生成二叉排序樹是不是非常簡單呢。是。下面貼**
//實陣列轉二叉排序樹的演算法 array需要轉二叉排序樹的陣列 n陣列的元素個數
//返回值是二叉樹根節點位址,這樣我們就可以通過返回值拿到二叉排序樹
bstnode* createbst(int array,int n)
//迴圈完畢後說明插入完畢
return bt; //把根節點返回去
}
查詢演算法 二叉排序樹
二叉排序樹,又稱二叉查詢樹,是一種對排序和查詢都很有用的特殊二叉樹 定義二叉排序樹或者是一棵空樹,或者具有以下定義 1 若左子樹不為空,左子樹上所有結點值均小於根結點值 2 若右子樹不為空,右子樹上所有結點值均大於根結點值 3 左右子樹也分別為二叉排序樹。遞迴定義。有定義可得性質 中序遍歷二叉樹可得...
二叉排序樹的查詢
1.編寫函式,建立有序表,採用折半查詢實現某一已知的關鍵字的查詢 採用順序表儲存結構 2.編寫函式,隨機產生一組關鍵字,利用二叉排序樹的插入演算法建立二叉排序樹 3.編寫函式,在以上二叉排序樹中刪除某一指定關鍵字元素 4.編寫乙個主函式,在主函式中設計乙個簡單的選單,分別除錯上述演算法 二叉排序樹的...
查詢 二叉排序樹
順序查詢 順序查詢又叫線性查詢,是最基本的查詢技術,它的查詢過程是 從表中第乙個記錄開始,逐個進行記錄的關鍵字和給定值比較,若某個記錄的關鍵字和給定值相等,則查詢成功,找到所查的記錄 如果知道最後乙個記錄,其關鍵字和給定值比較都不等時,則表中沒有所查的記錄,查詢不成功。順序查詢演算法實現 如下 順序...