题意:给n个数,按照顺序插入AVL,输出层次遍历,如果这颗AVL是完全二叉树,输出YES 否则输出NO
当时考试的时候。忘记AVL什么时候旋转了,数据结构不会写,感觉药丸
判断完全二叉树,这个简单,是编号也好,根节点为1,左右儿子2*l,2*l+1,判断最大的编号是否是n即可
或者把每个节点插入队列,遇到nullptr停止,判断队列中是否剩下的有非nullptr节点
至于AVL的旋转,旋转没什么难得,记住就好
#include<bits/stdc++.h> using namespace std;struct node{int val;node *ch[2];node(){val=0;ch[0]=ch[1]=nullptr;}node(int val){this->val=val;ch[0]=ch[1]=nullptr;} }*root;void rotate(node* &rt,int d){node *t=rt->ch[d^1];rt->ch[d^1]=t->ch[d];t->ch[d]=rt;rt=t; }int gethight(node* root){if(root==nullptr)return 0;return max(gethight(root->ch[0]),gethight(root->ch[1]))+1; }void insert(node *&rt,int val){if(rt==nullptr){rt=new node(val);return ;}bool flag;int l,r;if(rt->val>val){flag=0;insert(rt->ch[0],val);l=gethight(rt->ch[0]);r=gethight(rt->ch[1]);if(l-r>1){if(val<rt->ch[0]->val)rotate(rt,1);else{rotate(rt->ch[0],0);rotate(rt,1);}}}else{flag=1;insert(rt->ch[1],val);l=gethight(rt->ch[0]);r=gethight(rt->ch[1]);if(r-l>1){if(val>rt->ch[1]->val)rotate(rt,0);else{rotate(rt->ch[1],1);rotate(rt,0);}}} }void print(){queue<node*> q;vector<int> ans;q.push(root);while(!q.empty()){node *t=q.front();q.pop();ans.push_back(t->val);if(t->ch[0])q.push(t->ch[0]);if(t->ch[1])q.push(t->ch[1]);}cout<<ans[0];for(int i=1;i<ans.size();i++)cout<<" "<<ans[i];cout<<endl;bool ok=1;q.push(root);while(q.front()!=nullptr){node* t=q.front();q.pop();q.push(t->ch[0]);q.push(t->ch[1]);}while(!q.empty()){node* t=q.front();q.pop();if(t!=nullptr)ok=0;}printf("%s\n",ok?"YES":"NO"); }int main(){root=nullptr;int n,v;cin>>n;for(int i=0;i<n;i++){cin>>v;insert(root,v);}print();return 0; }