PAT甲级1123 Is It a Complete AVL Tree (30分):[C++题解]建立平衡树、bfs,判完全二叉树
生活随笔
收集整理的這篇文章主要介紹了
PAT甲级1123 Is It a Complete AVL Tree (30分):[C++题解]建立平衡树、bfs,判完全二叉树
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 題目分析
- 題目鏈接
題目分析
來源:pat網站
本題作為進階題,它的基礎知識點如下幾題。
PAT甲級1066 Root of AVL Tree (25分):[C++題解]建立平衡樹(AVL樹)
PAT甲級1110 Complete Binary Tree:[C++題解]判斷完全二叉樹
下面的代碼把判斷完全二叉樹寫在了層序遍歷bfs里面。其實,判斷完全二叉樹比較簡單,就是從根節點開始,把結點同時存到數組中,如果是完全二叉樹,數組中1~n下標是填滿的,不會有大于n的;如果不是完全二叉樹,就會出現存在數組中的下標大于n的情況。 本文用pos數組記錄下標。
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 30; int l[N],r[N],h[N],v[N]; //v[]是權值 int idx ,n,q[N]; int pos[N]; //數組中的下標,用于判斷是否是完全二叉樹//求某結點高度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; } //構造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; //根結點在數組中下標是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分)
總結
以上是生活随笔為你收集整理的PAT甲级1123 Is It a Complete AVL Tree (30分):[C++题解]建立平衡树、bfs,判完全二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PAT甲级1066 Root of AV
- 下一篇: PAT甲级1135 Is It A Re