日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)

發布時間:2025/4/5 c/c++ 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

    • 題目分析
    • 題目鏈接

題目分析



圖片來源:acwing
分析
平衡樹(AVL樹)是平衡二叉搜索樹的簡稱,當然需要滿足二叉搜索樹的性質,左子樹小于根,根小于等于右子樹;然后還要滿足平衡樹的基本特性,就是任意一個結點的左右子樹高度之差不超過1.

不平衡的BST可以經過左旋或者右旋變成新的平衡樹。左旋和右旋只是改變樹的結構,不會改變樹的中序遍歷結果。

以下圖說明右旋的過程,實際上,下圖已經是平衡樹,不用旋轉。仍然可以說明右旋的具體操作。下圖中L[]數組表示左兒子,R[]數組表示右兒子。

右旋分為三步:1)B變成根;2)A變成B的右孩子;3)把E變成A的左孩子。


實現右旋的代碼如下:其中update是一個函數,用來計算結點高度。請讀者對照上圖閱讀本代碼。

/* 右旋 u 是結點 */ void R(int& u){int p =l[u]; //左兒子記為pl[u] =r[p];//p的右兒子(E)變成原來根(A)的左兒子r[p] = u; //新根的右兒子是原來的根uupdate(u),update(p); //重新計算高度u = p; //根結點變成左兒子p }

將右圖轉化為左圖就是左旋,如下圖。


左旋代碼:和右旋正好對稱,將l和r互換即可。

void L(int& u){int p = r[u];//右兒子(圖中的A)記pr[u] = l[p]; //p(圖中的A)的左兒子(圖中的E)變成原來根(圖中的B)的右兒子l[p] = u; //原來的根(圖中的B)變成p(圖中的A)的左兒子update(u),update(p); //重新計算結點的高度u = p; }

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。

#include<bits/stdc++.h> using namespace std;const int N = 40; int l[N],r[N],v[N];//權值 int n; int h[N];//高度 int idx; /*update求每一結點的高度*/ void update(int u){h[u] =max(h[l[u]] , h[r[u]]) + 1; }/* 右旋 u 是結點 */ void R(int& u){int p =l[u]; //左兒子成為新的根l[u] =r[p];//根的左兒子變成r[p] = u; //新根的右兒子是原來的根uupdate(u),update(p); //重新計算高度u = p; //根結點變成左兒子p }/* 左旋 u是結點 */ void L(int& u){int p = r[u];//右兒子成為新根r[u] = l[p];l[p] = u;update(u),update(p);u = p; } /* get_balance左子樹和右子樹高度差 */ int get_balance(int u){return h[l[u]] -h[r[u]]; }/* insert建平衡樹 1.二叉搜索樹 2.高度差≤1 */ void insert(int &u, int w){if(u==0){u =++idx;v[u] =w;}else if(w< v[u]){insert(l[u],w);//左子樹比右子樹高2 情況[1]if(get_balance(u) ==2){//以左兒子為根,其左子樹以右子樹高1if(get_balance(l[u]) ==1) R(u);//以左兒子為根,其右子樹比左子樹高1 如情況[3]else L(l[u]),R(u);}} else {insert(r[u],w);//右子樹比左子樹高2 如情況[2]if(get_balance(u) == -2){//以右兒子為根,其右子樹比左子樹高1,if(get_balance(r[u]) == -1) L(u);//以右兒子為根,其左子樹比右子樹高1else R(r[u]),L(u);}}update(u); //求u結點的高度 }int main(){cin >> n;int root =0;while(n--){int w;cin>> w;insert(root ,w);}//輸出avl樹根cout<<v[root]<<endl; }

題目鏈接

PAT甲級1066 Root of AVL Tree (25分)

acwing1552. AVL樹的根

總結

以上是生活随笔為你收集整理的PAT甲级1066 Root of AVL Tree (25分):[C++题解]建立平衡树(AVL树)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲综合伊人 | 欧美毛片在线观看 | 99综合在线| 四虎库| 国产日韩一区二区三区 | 日韩精品中字 | 日本在线视频中文字幕 | 无码日韩精品视频 | 中文在线最新版天堂8 | 97色干| 婷婷丁香激情 | 成人在线观看小视频 | 国产成人在线看 | 日本公妇乱偷中文字幕 | 国产99页| xxxx视频在线观看 | 国产视频97 | 高清无打码 | 白丝美女被草 | 99精品视频一区二区三区 | 国产山村乱淫老妇女视频 | 无码无遮挡又大又爽又黄的视频 | 国产精品久久久久影院老司 | 99热这里都是精品 | 亚洲1级片 | 欧美精品五区 | 日韩 欧美 亚洲 国产 | 中国新婚夫妻性猛交 | 亚洲视频高清 | 日本v视频| 打开免费观看视频在线播放 | 亚洲精品少妇久久久久久 | 欧美激情一区二区三区免费观看 | 视色视频 | 免费av播放 | 一级片黄色片 | 91麻豆国产精品 | 久久精品视频一区二区三区 | 色婷婷色婷婷 | 国产亚洲欧美日韩精品 | 毛片毛片毛片毛片毛片毛片 | 日本成人黄色片 | 男女午夜激情视频 | 69视频免费| 北条麻妃av在线 | 另类ts人妖一区二区三区 | 大奶毛片 | 亚洲色在线视频 | 国内成人av| 国产精在线 | 91国产在线免费观看 | 国产一区在线免费 | 久久99热久久99精品 | 白嫩情侣偷拍呻吟刺激 | 国内自拍第二页 | 国产精品一二三区 | 丁香六月婷婷 | 正在播放一区二区 | 波多野结衣在线一区二区 | 国产欧美一区二区三区免费看 | 午夜老司机免费视频 | 欧美精品黄色片 | 黄污视频在线观看 | 污污视频在线免费看 | 久艹在线观看 | 夜色成人网 | 欧美一区二区三区免 | 日韩少妇视频 | 欧美日韩在线观看一区二区三区 | 182tv午夜福利在线观看 | 天天爱天天舔 | 一级黄色片视频 | 91香蕉国产 | 三级a做爰全过程 | 女女互慰吃奶互揉调教捆绑 | 激情视频区 | 这里精品| 美女扒开腿让人桶爽 | 欧美精品系列 | 一区二区三区四区免费观看 | 欧亚av | 超碰人人国产 | 在线日韩中文字幕 | 尤物国产视频 | 精品夜夜澡人妻无码av | 国产精品乱码 | 中文字幕精品一区 | 色欲av永久无码精品无码蜜桃 | 手机av在线网 | 国产嗷嗷叫 | 午夜精品久久久久久久久久久久久蜜桃 | 国外成人性视频免费 | 欧美 日韩 国产 亚洲 色 | 日本熟妇色xxxxx日本免费看 | 亚洲视频在线观看视频 | 久操伊人 | 久久福利一区 | 成人免费毛片免费 | 黄色美女av |