二叉查詢樹的插入刪除查詢

著了迷發表於2019-03-03

二叉查詢樹的介紹

二叉查詢數是二叉樹中常見的一種型別,也叫二叉搜尋樹。二叉查詢樹的特點是,任意一個節點的左子樹上的每一個結點都要小於這個結點的值,任意節點的右子樹上的每一個結點都要大於這個結點的值。如下圖所示

二叉查詢樹的插入刪除查詢


1.二叉查詢樹的查詢

二叉樹的查詢,先取樹的根節點,如果他們是我們要找的節點,那麼直接返回,如果查詢的資料比根節點大,那麼就去遞迴查詢根節點的右子樹,反之,遞迴查詢根節點的左子樹。


2.二叉查詢樹的插入

二叉查詢樹的插入和查詢原理類似,新插入的資料一般都是在葉子節點上的,所以我們只要從根節點出發,依次比較要插入的資料和節點大小的對比。如果插入的資料比當前的節點大,並且節點的右子樹為空,那麼直接把當前的值插入到當前右子節點,如果不為空的話,那麼遞迴查詢右子樹的位置,同理如果插入的資料比節點小,並且節點的左子樹為空,那麼直接把值插入到節點的左節點,如果不為空,遞迴遍歷節點的左子樹,尋找插入的位置


3.二叉樹的刪除

二叉樹的刪除會麻煩一點,我們分三種情況
1.如果刪除的節點沒有子節點了,那麼我們只需要把他父節點指向當前要刪除的節點的指標指向null,比如圖中的48
2.如果當前節點存在一個節點(左節點或者右節點),那麼我們只需要把父節點指向當前要刪除的節點的子節點(左或者右),比如圖中的75
3.如果當前節點存在兩個子節點,那麼我們需要查詢出當前節點右子樹上最小的節點,把這個最小節點,把他替換到要刪除的節點上面,因為最小節點肯定沒有左子節點(如果有的話,那他就不是最小節點了),例如刪除圖中的38


二叉查詢樹的其他操作

還有一個重要的特性就是,如果對二叉查詢樹進行中序遍歷,那麼將得到當前樹的順序數列,時間複雜度為0(n),所以二叉查詢樹右叫二叉排序樹。

我們以上說的都是不存在鍵值的情況,具體的場景中,如果儲存的物件鍵值相同,咋麼處理?我們可以把同樣的值存在同一個節點上,通過連結串列和動態擴容的陣列就能實現.第二種就是,當有兩個值相同時,我們把當前值插入到這個節點的右子樹上,也就是把他當成比當前這個節點大的值來處理。那麼當查詢資料找到相同值時,我們不能停止查詢,而是要繼續查詢他的右子節點,直至葉子節點。對應的刪除操作也要做同樣的處理。

二查查詢樹的時間複雜度分析

二叉樹有很多種表現的形式,不同的形式所需的大O時間是不一樣的,最壞的情況下,二叉樹退化成連結串列,大O時間就是O(n),不管是插入,查詢,刪除,他的需的時間都是和樹的高度成正比的,也就是O(height),正因為這個原因,所以我們需要構建一棵比較平衡的二叉查詢樹。

相關文章