學習筆記第六節 伸展樹splay

2021-08-19 22:43:18 字數 1943 閱讀 3036

正文

說到伸展樹,大家想到的可能是複雜,**冗長,很容易打錯,思路卻很好理解。

沒錯,伸展樹的確是這麼乙個東西,如果你做多了題,學會用它之後,你就會覺得很得心應手,輕鬆面對許多高階資料結構題。這個當然也是乙個鍛鍊人的耐心的東西,有乙份**調了4天emm。

伸展樹是一棵二叉搜尋樹,就是說,它是一棵單一關鍵字排序的二叉樹。

也就是說,比您小的都在您的左邊,比您大的都在您的右邊,這樣平衡,可以使得我們很快的訪問乙個區間。

重點1

向上翻飛。

別想太多,就是讓您可以往上走的操作,比如說下面這棵樹,2想到4的位置怎麼辦emm

這時候我們就要想出一定的方法:

1.首先,考慮的旋轉方式肯定是包含我,我的父親。

2.其次,如果我是我的父親的左兒子,那麼我的父親肯定是當我的右兒子(因為比我大)。

就有上面的兩種情況。

3.我們同時要考慮他們的兒子的繼承,包括爺爺是誰的爸爸也要分清。

其他情況自己可以推一推哦~

明顯發現,除了綠綠的點之外,其他點所連線的關係都有發生變化,那麼該如何考慮這種狀態呢?

下面給出函式通式

void rotate(int x,int w)
希望理解一下父親與我的關係和操作有什麼關係emm

不斷的上旋即可達到目標。。

void splay(int x,int tar)

else

else

}else

else

}} }

if(tar==0) root=x;

}

雙旋這個東西很曼妙。

後面的操作就很簡單啊。

比如說,以維護關鍵字來找元素:

int findip(int x)

if(s[ip].v<=x) return 0;

return s[ip].v;

}

找後繼也是如此哦~:

int find_next(int x)

if(s[ip].v<=x) return 0;

return s[ip].v;

}

找某個數的排名,相當於把它旋到根之後的左子樹大小+1(比他小的數的後乙個)

int find_rank(int x)
找排名為k的數,根據左右子樹的大小往下找:

int find_num(int x)

else break;

}return s[now].v;

}

刪除某個節點,可以分情況討論:

1.沒有左右兒子,直接清空整棵樹。

2.只有左兒子,讓左兒子當根。

3.只有右兒子,讓右兒子當根。

4.左右兒子都有,要找這個數的前驅來代替他,因為在左子樹它是最大的,所以將它旋到x的兒子後,直接將右兒子繼承給他即可。。

void del(int x)

else if(s[ip].son[0]==0 && s[ip].son[1]!=0)

else

}

好像寫的不怎麼樣,有點趕吧,對不起了,有什麼問題或者想吐槽部落格的,都可以在下面登陸之後,耐心的解說

大罵樓主。

再次感謝閱讀我的部落格,希望你們個個ioi金牌

C 學習 第六節

什麼是型別 type 型別在c 中的作用 c 語言的型別系統 變數 物件與記憶體 型別 type 資料型別 性質相同的值得集合 記憶體 內部儲存單元,計算機執行程式的空間 外存 擴充套件儲存器,硬碟 賦值用 判斷用 dynamic 動態字元定義,弱型別的使用方法,c 是強型別程式語言 1 資料型別表...

php學習筆記 第六節 迴圈

這幾天村里跟電信的鬧了點矛盾,導致快一周了沒網,超級鬱悶。不管是村里的問題還是電信的問題,最終受害的只有普通的民眾,民眾永遠都是犧牲品,無奈。言歸正傳,繼續php學習。php中的迴圈有以下幾種 用法和其他語言沒什麼兩樣,不再累贅。下面簡單的列一下 foreach 的用法foreach 語句用於迴圈遍...

第六節 Node陣列

var arr new array var arr array var arr array 1,2,3,4 var arr var arr 1,2,3 instanceof 操作符 array.isarray 方法 1.將物件的鍵值轉換為陣列 object.keys 2.string型別轉換為陣列 ...