首先定義數據結構苟耻,這個不用多說兆龙,這里添加了一個size核偿,這樣就可以在o(1)的時間復雜度內獲取這個二叉樹的大小。
首先要寫的是添加節(jié)點(put)接口:通過和當前節(jié)點的key比較碳竟,如果相等就更新val草丧,如果小于就遍歷左節(jié)點,反之則遍歷右節(jié)點莹桅。
如果沒有找到就創(chuàng)建一個新節(jié)點:
然后是 get接口昌执,這個接口也比較簡單,和put類似统翩,左右遍歷即可:
個人認為二叉查找數最大的難點是刪除一個樹節(jié)點
有4種情況:
1仙蚜,待刪除節(jié)點的左右節(jié)點都為null,直接返回null
2厂汗,待刪除節(jié)點的左節(jié)點為null委粉,直接返回右節(jié)點
3,待刪除節(jié)點的右節(jié)點為null娶桦,直接返回左節(jié)點
4贾节,待刪除節(jié)點的左右節(jié)點都不為null汁汗, 一種普遍的做法是用該節(jié)點的右節(jié)點的最小的節(jié)點來代替這個節(jié)點來保持二叉數的穩(wěn)定。
手畫圖:
具體代碼如下
先寫出刪除該樹的最小節(jié)點和找到這個樹的最小節(jié)點栗涂。這兩個函數相對比較簡單
然后是具體的刪除函數:
這是比較關鍵的代碼:
先獲取待刪除節(jié)點的右節(jié)點的最小節(jié)點知牌,使新節(jié)點的右節(jié)點等于原節(jié)點的有節(jié)點刪除最小節(jié)點后的值(即刪除獲取到的新節(jié)點),左節(jié)點就等于原節(jié)點的左節(jié)點斤程。
用中序遍歷驗證函數的正確性:
代碼寫的不好或者有bug的地方角寸,歡迎各位大佬來拍磚壶笼。
參考:算法(第四版)