▎前言
小編菜歸菜,但是好歹也寫過幾篇關於樹的部落格:線段樹
、劃分樹
、紅黑樹
。如果你已經會了這些樹,那麼你一定會認為樹很麻煩,很燒腦。
其中的紅黑樹是一種二叉排序樹實現自平衡的樹,但是最煩人,線段樹和劃分樹都很好寫,而紅黑樹不僅要建樹、查詢,還要再實現自平衡。
但是虛二叉樹和紅黑樹功能一樣,只不過更大的優點在於計數,卻免去了建樹和實現自平衡的過程。
▎虛二叉樹
☞『定義』
通常的靜態二叉排序樹,需要先構造一棵空樹,而虛二叉樹巧妙的結合了二分法,省略掉了這個過程。
由於不直接去構造二叉樹,所以便失去了二叉樹的外顯形式,因此我們稱之為:虛二叉樹。
說白了就是免去建樹的靜態二叉排序樹,所以說是「虛」二叉樹。
☞『演算法核心』
在我們對乙個有序的數列進行二分查詢時,實際上就相當於對一棵二叉樹進行查詢。
例如下面就是乙個二分查詢的示例程式:
1int search(intx)2
11 }
其中我們不難發現mid始終就是[l,r]區間的中點,類似於二叉樹中的根。
而左邊[l,mid-1]則形成了其左子樹形態。
右邊[mid+1,r]則形成了其右子樹的形態。
這棵二叉樹就是虛二叉樹。
相信用過樹的大家應該都知道使用陣列完全是靠節點編號關係來判斷的,所以根不一定是最中間的,但是虛二叉樹的根是在中間的。
虛二叉樹雖然不是近似滿二叉樹,也沒有靜態二叉排序樹那樣完美的結構,但是卻是天然的平衡二叉樹,由二分查詢的過程知道最多查詢log n次即可,因此虛二叉樹和平衡二叉樹的時間複雜度相差無幾,卻大大降低了**複雜度。
☞『不同』
虛二叉樹不就是二分查詢嗎?相信你早已開始吐槽了。
其實虛二叉樹與二分查詢不一樣,最大的不同正是它的優點。
在實現靜態二叉排序樹時,我們就會把所有的需要修改的量都保留在根節點上,虛二叉樹也可以這樣做,每棵子樹的根節點實際上就是mid,那麼我們就可以在mid上保留資訊了。
其實這乙個不同和虛二叉樹的用途有關,虛二叉樹可以利用這一點統計個數。
☞『優點』
我們只要想象這棵二叉樹長什麼樣,理解就不困難了。
這樣的的虛實現省去了構造,實現上就得以進一步簡化。
程式設計訓練第四十四期 多數元素
給定乙個大小為 n 的陣列,找到其中的多數元素。多數元素是指在陣列 現次數 大於 n 2 的元素。你可以假設陣列是非空的,並且給定的陣列總是存在多數元素。1.雜湊表 時間複雜度o n 我們遍歷陣列 nums 一次,對於 nums 中的每乙個元素,將其插入雜湊表都只需要常數時間。如果在遍歷時沒有維護最...
Android第四十四期 登入介面的動畫
這次是需求有點無語,不過還是做出來了,效果如下,這回要講講,有點複雜,以後自己估計都忘了,記錄一下 動畫類animalutul public class animalutul public void setstarttime long starttime public animalutul cont...
演算法 日更 第四十期 簡單計數原理
加法原理 引入 先來思考乙個問題 現在擺在你眼前的有15個夾心餅乾,10個紅豆餅,12個旺旺雪餅,可是gzr me 由於吃過飯,所以太撐了。為了不讓gzr吐,所以你只能給他吃一樣東西,那麼選擇的方案數有多少種呢?顯然,這道題很簡單,當然是15 10 12 37種方案。沒錯,這就是加法原理。定義 假設...