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

歡迎訪問 生活随笔!

生活随笔

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

c/c++

PAT甲级1123 Is It a Complete AVL Tree (30分):[C++题解]建立平衡树、bfs,判完全二叉树

發(fā)布時間:2025/4/5 c/c++ 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级1123 Is It a Complete AVL Tree (30分):[C++题解]建立平衡树、bfs,判完全二叉树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • 題目分析
    • 題目鏈接

題目分析


來源:pat網(wǎng)站

本題作為進階題,它的基礎(chǔ)知識點如下幾題。

PAT甲級1066 Root of AVL Tree (25分):[C++題解]建立平衡樹(AVL樹)

PAT甲級1110 Complete Binary Tree:[C++題解]判斷完全二叉樹

下面的代碼把判斷完全二叉樹寫在了層序遍歷bfs里面。其實,判斷完全二叉樹比較簡單,就是從根節(jié)點開始,把結(jié)點同時存到數(shù)組中,如果是完全二叉樹,數(shù)組中1~n下標是填滿的,不會有大于n的;如果不是完全二叉樹,就會出現(xiàn)存在數(shù)組中的下標大于n的情況。 本文用pos數(shù)組記錄下標。

ac代碼

#include<bits/stdc++.h> using namespace std; const int N = 30; int l[N],r[N],h[N],v[N]; //v[]是權(quán)值 int idx ,n,q[N]; int pos[N]; //數(shù)組中的下標,用于判斷是否是完全二叉樹//求某結(jié)點高度void get_height(int u){h[u] = max(h[l[u]] , h[r[u]]) +1; }//左子樹-右子樹之差int get_balance(int u){ return h[l[u]] - h[r[u]]; }//右旋 void R(int& u){int p= l[u];l[u] = r[p];r[p] = u;get_height(u),get_height(p);u = p; }//左旋 void L(int& u){int p = r[u];r[u] =l[p];l[p] = u;get_height(u),get_height(p);u = p; } //構(gòu)造AVL樹void insert(int& u, int w){if(u == 0) u= ++idx, v[u] =w;else if(w < v[u]){insert(l[u],w);if(get_balance(u) == 2){if(get_balance(l[u]) == 1) R(u);else L(l[u]),R(u);}}else{insert(r[u],w);if(get_balance(u) == -2){if(get_balance(r[u]) == -1) L(u);else R(r[u]),L(u);}}get_height(u); //更新高度 }// 層序遍歷bfs // 同時看是否是完全二叉樹 bool bfs(int root){int hh = 0, tt = 0;q[0] =root;pos[root] =1; //根結(jié)點在數(shù)組中下標是1bool res = true; //是完全二叉樹while(hh<= tt){ //手寫隊列int t= q[hh++];if(pos[t] >n) res =false; //不是完全二叉樹if(l[t]) q[++tt] =l[t] ,pos[l[t]] = pos[t]*2;if(r[t]) q[++tt] =r[t],pos[r[t]] = pos[t]*2 +1;}return res;}int main(){cin>> n;int root = 0;for(int i=0;i<n; i++){int w;cin >> w;insert(root, w);}bool res =bfs(root);cout<<v[q[0]];for(int i=1;i<n;i++) cout<<" "<<v[q[i]];cout<<endl;if(res) cout<<"YES"<<endl;else cout<<"NO"<<endl; }

題目鏈接

PAT甲級1123 Is It a Complete AVL Tree (30分)

總結(jié)

以上是生活随笔為你收集整理的PAT甲级1123 Is It a Complete AVL Tree (30分):[C++题解]建立平衡树、bfs,判完全二叉树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。