資料結構 樹 二叉查詢樹

2022-02-13 07:10:26 字數 2771 閱讀 8807

wiki:

首先是名稱:二叉查詢樹英文叫binary search tree,這個在很多演算法題目中很常見所以要記住,特別是英文題目中。也叫做二叉排序樹,二叉搜尋樹等等。

具體的定義比較官方,用自己的話說,首先它肯定是二叉樹,其次,當前節點的左子葉元素值比當前節點小,右子葉元素值比當前節點大,所以節點均滿足這個規則的二叉樹。

wiki中簡介中簡單描述了它的作用,用於根據鍵來快速的查詢元素。

比如根據名字查詢手機號。也給出了它的重要特點,查詢,刪除,新增速度快。

better than the linear time比線性的未排序的陣列快;

slower than the corresponding operations on hash tables.比雜湊表慢。

可以看到,平均為logn比n快。

其實也很好理解,因為二叉查詢樹的主要思想就是利用了二分查詢的思想。每次查詢都讓一些不需要被遍歷到的元素給移出了。而因為其特殊的資料結構存放方式,使得這樣查詢特別方便。

查詢的過程就不贅述了,就是比較之後查左邊還是查右邊。實現很簡單。也就不多說了。

對於第一次接觸的人來說,主要的難點在於:

1、刪除,很多人應該和我一樣,對於樹的刪除節點一直很頭疼總覺的乙個不好整個樹的結構就要變了。

2、新增,如果是新增最後的節點還好,但是新增中間的節點和刪除一樣生疼。

3、生成,說了半天,我們都是拿一顆已有的樹來說話,但是對於大多數的題目來說,都需要你自己生成一顆樹,那麼如何生成呢?

首先要把刪除分成三種情況來討論

第一種,最簡單,如果要刪除的節點沒有子節點,那麼就直接刪除。

第二種,也簡單,如果要刪除的節點只有乙個子節點,那麼用這個子節點直接代替這個需要刪除的節點即可。

第三種,麻煩一些,但是說簡單也簡單,注意理解!

首先你這樣想,第三種情況是兩邊都有子節點,你刪除這個節點必須要有乙個元素代替這個位置,讓整棵樹不變才可以;我們繼續想,如果乙個排序好的列表,12345,如果要刪除3這個元素,那麼我們合理的想到就是拿2或者4代替它就可以了;也就是說,我們要在這棵樹找到和刪除元素相差最小的元素和它替換就可以了,這個數比它大,比它小都可以。

首先我們找比這個數小乙個頭的數;由二叉查詢樹的特性我們很簡單就能找到它,我們先把需要刪除的節點定為p,因為要找比p小的,那麼我們先往左邊找,左邊都是比p小的,比p小的中最大的乙個就是我們要找的,所以我們之後一直往右找,就找到了這個元素w,將這個元素和p替換,之後按照前面兩種方法刪除w就可以了,因為w元素肯定最多只有左子葉了。

下面用圖來解釋:

原來的樹長這樣

我們要刪除7這個點,那麼我們按照剛才說的,我們找左邊最大的6

然後拿6替換7

然後按照前面兩種方法,舊的6節點,前面的第二種方法說道,如果有乙個。。。就。。。我不多說了,反正最後就這樣了。

同理找8替換7也是乙個意思,也是一種方法。

貼一下最後的結果,其實很簡單。

所以,仔細理解一下,其實自己也能想到(滑稽臉)

刪除的**實現

//

從二叉查詢樹中刪除指標p所指向的結點 ,p非空,刪除前驅方式

void removenode1(bstnode *&p)

else

if(!p->lchild)//

*p的左子樹為空

else

//左右子樹均不空

p->data = s->data; //

*s結點中的資料轉移到*p結點,然後刪除*s

if(q != p) //

p->lchild右子樹非空

else

//p->lchild右子樹為空 ,此時q ==p

delete s; //

刪除結點*s

}}

首先,新增要滿足乙個條件,查詢二叉樹是不能有重複的兩個元素的。

所以插入的元素不能已經存在於查詢二叉樹中。

然後糾正乙個觀點,插入的節點我們都把它放在最後的子葉節點中,而不會中間去插入。所以不用擔心咯。

首先查詢新增元素應該在的位置,查詢我就不多說了,很簡單的,如果這個元素存在就不加了,如果不存在,就加在那個位置就行了。

用圖來說明,剛才我們刪了7,那麼我們再來加入7,最後成這樣。

說到這裡,也就引出了我們最後乙個,生成樹。

為什麼放在最後說呢?

其實明白人已經從前面的新增體會到了。

二叉查詢樹的樣子千變萬化,一顆樹長成什麼樣子都可以。只要滿足定義就可以了。

根據題目的意思去生成你需要的就可以了,題目肯定會給出一組亂序的樹,你慢慢插入即可。

參考資料:

(資料結構)二叉查詢樹

樹,是一種資料結構。它是由n個有限節點組成乙個具有層次關係的集合。特點 樹的基本術語 節點的度 節點擁有的子樹的數目。葉子 度為零的節點。分支節點 度不為零的節點。樹的度 樹中節點的最大的度。層次 根節點的層次為1,其餘節點的層次等於該節點的雙親的層次加1。樹的高度 樹中節點的最大層次。無序樹 如果...

資料結構 二叉查詢樹

使二叉樹成為二叉查詢樹的性質是,對於樹中的每個節點x,它的左子樹中所有關鍵字值小於x的關鍵字值,而它的右子樹中所有關鍵字值大於x的關鍵字值。這意味著,該樹所有的元素以某種統一的方式排序。二叉查詢樹是一棵特殊的二叉樹,二叉查詢樹中節點的結構與二叉樹種節點的結構相同,關鍵在於可以在二叉查詢樹上可以執行的...

資料結構之二叉查詢樹

針對二叉查詢樹的操作 增刪改查 的時間和樹的高度成正比,比如都有10個節點的乙個樹,樹高為4和樹高為10的操作時間肯定是不同的,這個時間實際上是o lgn 二叉查詢樹的期望的樹高是lgn,從而基本動態集合的操作平均時間為 lgn 通常二叉查詢樹基於鍊錶實現,每個節點儲存左,右子節點,如果想更方便的實...