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