二叉搜索樹的簡單介紹

前言

本人是算法小白,java寫得比較多,因此不說算法具體實現和列代碼,也沒那個實力,因此本文的出發點是,對算法不很是感冒的小白作個簡易瞭解。java

參考:算法導論算法

關於二叉搜索樹

便於查找特定數據,按關鍵字大小構造的一棵二叉樹,紅黑樹和B-Tree都是二叉搜索樹的變形,因此二叉搜索樹很關鍵又很容易掌握。多說無益,直接給demoblog

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

這是用一個手機軟件畫的(看水印就知道了),很好用,在這裏給它打個小廣告。排序

本文規約:

一個結點x,x.key表明x的關鍵字,x.left表明x的左孩子,x.right表明x的右孩子,x.p表明x的雙親(parent,或者叫父親) 遞歸

 

特色(結構):

這是一棵二叉搜索樹,它的特色就是對於任意一個結點,其左子樹中最大關鍵字都不超過x.key,其右子樹中最小關鍵字都不小於x.key。這樣結構很容易聯想到二分法,二分法在一個有序序列找一個數效率是挺可觀的。效率

這個特色的好處:

在demo中,咱們要找20,就從根結點40開始,40>20,因此咱們去40的左孩子9,9<20,因此去9的右孩子,20==20,找到了。固然若是找不到就返回NULL或者NIL(算法書裏面用來講明該結點是空的一個特殊結點),因而乎,很容易想象到二叉搜索樹的查找代碼就是一個簡單的遞歸。軟件

 

缺點:

demo中若是細心就會發現這棵書的右邊很臃腫,二叉搜索樹的缺點即是在這裏,這棵樹很是不平衡,或者說數據很是極端,偏向於某一邊,那麼這個樹的查找效率就跟遍歷一個序列沒什麼差異,因此紅黑樹的目的就是讓二叉搜索樹近似於平衡。二叉樹

有序:

由於二叉搜索樹的特色,若是中序遍歷這棵樹,輸出的序列就是全部關鍵字的正向排序。能夠試下中序遍歷demo,輸出就是3,6,9,13,20,40,50,65,73,90搜索

插入和刪除:

插入:

插入比較簡單,跟查找相似,一直往下,比新結點z小就往左,比z大就往右,知道遇到NULL或者NIL,就掛在那個葉子結點上。插入一直是在後面樹的底插,因此二叉搜索樹的根結點就是第一個插入的結點,並且不能保證這棵樹是否是平衡遍歷

刪除:

刪除分三種狀況:

  1. 刪除結點z沒有孩子結點,直接把z從父節點斷開,並用NULL或者NIL替換z
  2. 若是z只有一個孩子結點,把這個孩子結點代替z就能夠了
  3. 若是z有兩個孩子,這時候略微麻煩,先說一下什麼是後繼

後繼:一個結點x的後繼,就是關鍵字大於x.key的結點中最小的那個,注意這裏有兩種狀況,若是x是有右子樹,那就是x的右子樹中最小那個,也就是x的右子樹的最左那個結點;若是x是沒有右子樹,那就須要往上找,從x的父結點開始,一直往左上走(對的是左上方向),一直沒有路了,那終點的父節點就是x的後繼了。對於第二種狀況我給個圖:

 回到剛剛刪除的第三種狀況,刪除結點z有兩個孩子,咱們須要找到z的後繼y(必定會在z的右子樹( ̄▽ ̄) ,額好像上面白講了),用z的後繼y代替z,z的右子樹成爲y的新的右子樹,z的左子樹稱爲y的新的左子樹。這裏直接上算法導論的圖

相關文章
相關標籤/搜索