PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)
文章目錄
- 題目分析
- 題目鏈接
題目分析
圖片來源:acwing
分析
平衡樹(AVL樹)是平衡二叉搜索樹的簡稱,當然需要滿足二叉搜索樹的性質,左子樹小于根,根小于等于右子樹;然后還要滿足平衡樹的基本特性,就是任意一個結點的左右子樹高度之差不超過1.
不平衡的BST可以經過左旋或者右旋變成新的平衡樹。左旋和右旋只是改變樹的結構,不會改變樹的中序遍歷結果。
以下圖說明右旋的過程,實際上,下圖已經是平衡樹,不用旋轉。仍然可以說明右旋的具體操作。下圖中L[]數組表示左兒子,R[]數組表示右兒子。
右旋分為三步:1)B變成根;2)A變成B的右孩子;3)把E變成A的左孩子。
實現右旋的代碼如下:其中update是一個函數,用來計算結點高度。請讀者對照上圖閱讀本代碼。
將右圖轉化為左圖就是左旋,如下圖。
左旋代碼:和右旋正好對稱,將l和r互換即可。
ac代碼
四種情況如下圖,insert()函數用來構造AVL樹,以A為樹根。
如果if(get_balance(u) == -2),表示 右子樹比左子樹高度高2,可以有兩種情況。 先取A的右孩子B,第一種是如果if(get_balance(u) == -1) 即B的右子樹高度比左子樹高1,即情況[2],此時左旋A;另一種是B的左子樹高度比右子樹高1,即情況[4].此時先右旋B,再左旋A。
如果if(get_balance(u) == 2) 表示左子樹高度比右子樹高2,可以分為兩種情況。先取A的左兒子B。第一種情況是如果if(get_balance(u) ==1) 表示B的左子樹比右子樹高度高1,即情況[1],此時右旋A; 另一種是B的右子樹比左子樹高1,即情況[3].此時先左旋B,再右旋A。
題目鏈接
PAT甲級1066 Root of AVL Tree (25分)
acwing1552. AVL樹的根
總結
以上是生活随笔為你收集整理的PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1138 Postorder
- 下一篇: PAT甲级1123 Is It a Co