0
点赞
收藏
分享

微信扫一扫

PAT (Advanced Level) Practice - 1123 Is It a Complete AVL Tree(30 分)


题目链接:​​点击打开链接​​

题目大意:输出AVL树的层序遍历 + 判断是否为完全二叉树。

解题思路:AVL树操作:插入、单/双旋转、树高 + 判断是否完全二叉树:在出现了一个孩子为空的结点之后是否还会出现孩子结点不为空的结点,如果出现了就不是完全二叉树。

AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);
#define INF 0x3f3f3f3f
#define MOD 1000000007

using namespace std;

typedef long long ll;

struct node
{
int val;
node *left,*right;
};

vector<int> v;
int after, isComp;

node *LL(node *tree)
{
node *tmp=tree->right;
tree->right=tmp->left;
tmp->left=tree;
return tmp;
}

node *RR(node *tree)
{
node *tmp=tree->left;
tree->left=tmp->right;
tmp->right=tree;
return tmp;
}

node *LR(node *tree)
{
tree->left=LL(tree->left);
tree=RR(tree);
return tree;
}

node *RL(node *tree)
{
tree->right=RR(tree->right);
tree=LL(tree);
return tree;
}

int getHeight(node *tree)
{
if(tree==NULL) return 0;
int l=getHeight(tree->left), r=getHeight(tree->right);
return l>r ? l+1 : r+1; // 到叶子结点时,无论是加 l+1 or r+1 只是加给自己本身
}

node *insert(node *tree, int val)
{
if(tree==NULL)
{
tree=new node();
tree->val=val;
// tree->left=tree->right=NULL;
return tree;
}

if(tree->val>val)
{
tree->left=insert(tree->left,val);
int l=getHeight(tree->left), r=getHeight(tree->right);
if(l-r>=2)
if(tree->left->val > val) tree=RR(tree);
else tree=LR(tree);
}
else
{
tree->right=insert(tree->right,val);
int l=getHeight(tree->left), r=getHeight(tree->right);
if(r-l>=2)
if(tree->right->val < val) tree=LL(tree);
else tree=RL(tree);
}

return tree;
}

void bfs(node *tree)
{
v.clear();
queue<node*> q;
q.push(tree);

after=0, isComp=1;
while(!q.empty())
{
tree=q.front(); q.pop();
v.push_back(tree->val);
if(tree->left!=NULL)
{
if(after) isComp=0;
q.push(tree->left);
}
else after=1;

if(tree->right!=NULL)
{
if(after) isComp=0;
q.push(tree->right);
}
else after=1;
}
}

int main()
{
int n,val;
while(~scanf("%d",&n))
{
node *tree=NULL;
for(int i=0;i<n;i++)
{
scanf("%d",&val);
tree=insert(tree,val);
}

bfs(tree);

for(int i=0;i<v.size()-1;i++) printf("%d ",v[i]);
printf("%d\n",v[v.size()-1]);
puts(isComp?"YES":"NO");
}

return 0;
}


举报

相关推荐

0 条评论