C/C++学习笔记:算法知识之平衡树学习笔记,收藏一波吧!
平衡樹存儲:
size就是節(jié)點(diǎn)的個(gè)數(shù)。
value是節(jié)點(diǎn)代表的權(quán)值。
權(quán)值相同的兩個(gè)節(jié)點(diǎn)被視為一個(gè),num記錄折疊數(shù)量。
rand是隨機(jī)數(shù),用來維護(hù)平衡樹。
son就是兩個(gè)兒子。
?
平衡樹size更新:
實(shí)際操作中,各個(gè)變量的值都是不斷更新的,size也不例外。
函數(shù)體:
一個(gè)節(jié)點(diǎn)包括的節(jié)點(diǎn)個(gè)數(shù)用腳也能想到:左兒子size與右兒子size的和,加上這個(gè)節(jié)點(diǎn)折疊數(shù)量。
完整的平衡樹size更新代碼:
?
平衡樹插入:
學(xué)習(xí)完上面的內(nèi)容,接下來的基本逼死人的操作插入與刪除就很簡單了:
由于Treap = Tree + Heap
所以平衡樹插入與二叉排序樹插入差不多
函數(shù)體:
插入節(jié)點(diǎn)總會遇到各種增加碼量的情況,需要我們一一判斷:
[ 1?]節(jié)點(diǎn)不存在
什么??節(jié)點(diǎn)不存在??殺了出題人!
當(dāng)插入函數(shù)用在建樹中,這種情況很常見。
沒有節(jié)點(diǎn),那我們就開墾一個(gè)節(jié)點(diǎn)。(水土流失,土地荒漠化請走開)
├ 節(jié)點(diǎn)總數(shù)加1
├ 新節(jié)點(diǎn)size為1
├ 新節(jié)點(diǎn)num為1
├ 權(quán)值為data
└ 生成rand
→→→嶄新的節(jié)點(diǎn)!!(不要998,不要98,只要9.8!)
代碼實(shí)現(xiàn)就是一個(gè)簡單的模擬:
?
?
?[ 2 ]有一個(gè)權(quán)值為data的節(jié)點(diǎn)
那更簡單了!!
[ 3?]尋找子樹滿足情況一或情況二
去哪棵子樹呢??定義一個(gè)變量。
有了明確的方向,就應(yīng)該堅(jiān)持走下去:
隨機(jī)數(shù)判斷,隨機(jī)旋轉(zhuǎn):
更新size:
pushup(root);
至此,插入操作基本完成。
完整平衡樹插入代碼:
?
平衡樹旋轉(zhuǎn):
平衡樹旋轉(zhuǎn)不破壞平衡樹的性質(zhì),也就是說
旋轉(zhuǎn)前:A<B<C<D<E<F
旋轉(zhuǎn)后:A<B<C<D<E<F
完整平衡樹旋轉(zhuǎn)代碼:
?
?
?
?
?
博客園:OIer|zythonc
學(xué)習(xí)C/C++編程知識,提升C/C++編程能力,歡迎關(guān)注博主微信公眾號:C語言編程學(xué)習(xí)基地,一起來學(xué)習(xí)編程吧!
總結(jié)
以上是生活随笔為你收集整理的C/C++学习笔记:算法知识之平衡树学习笔记,收藏一波吧!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 程序员求职面试丨面试必备之终极指导篇,掌
- 下一篇: C++ 长指针与指针的区别