考场遇到这种题我当场歇菜
题目要求先按AVL的规则建树,然后输出层序遍历结果,最后判断是不是完全二叉树。
判断不是完全二叉树看:
判断是否为完全二叉树:在出现空子节点之后仍有非空子节点出现则不为完全二叉树
判断是不是完全⼆叉树,就看在出现了⼀个孩⼦为空的结点之后是否还会出现孩⼦结点不为空的结
点,如果出现了就不是。
其他的方法:判断一棵树是否为完全二叉树:计算最大索引、节点数,判断二者是否相等。
int isComplete = 1, after = 0;
vector<int> levelOrder(node *tree) {
vector<int> v;
queue<node *> queue;
queue.push(tree);
while (!queue.empty()) {
node *temp = queue.front();
queue.pop();
v.push_back(temp->val);
if (temp->left != NULL) {
if (after) isComplete = 0;
queue.push(temp->left);
} else {
after = 1;
}
if (temp->right != NULL) {
if (after) isComplete = 0;
queue.push(temp->right);
} else {
after = 1;
}
}
return v;
}
#include<bits/stdc++.h>
using namespace std;
struct node{
int data;
node *left,*right;
};
node* left(node *tree){
node *temp=tree->right;
tree->right=temp->left;
temp->left=tree;
return temp;
}
node* right(node *tree){
node* temp=tree->left;
tree->left=temp->right;
temp->right=tree;
return temp;
}
node* leftright(node* tree){
tree->left=left(tree->left);
return right(tree);
}
node* rightleft(node* tree){
tree->right=right(tree->right);
return left(tree);
}
int getheight(node *tree){
if(tree==NULL) return 0;
int l=getheight(tree->left);
int r=getheight(tree->right);
return max(l,r)+1;
}
node* insert(node* tree,int data){
if(tree==NULL){
tree=new node();
tree->data=data;
// tree->left=tree->right=NULL;
}else if(tree->data>data){
tree->left=insert(tree->left,data);
int l=getheight(tree->left),r=getheight(tree->right);
if(l-r>=2){
if(data<tree->left->data) tree=right(tree);
else tree=leftright(tree);
}
}else{
tree->right=insert(tree->right,data);
int l=getheight(tree->left),r=getheight(tree->right);
if(r-l>=2){
if(data>tree->right->data) tree=left(tree);
else tree=rightleft(tree);
}
}
return tree;
}
bool f=0;
bool flag=true;
vector<int> v;
void level(node* tree){
queue<node*> q;
q.push(tree);
while(!q.empty()){
node* temp=q.front(); v.push_back(temp->data);
q.pop();
//这种不行,想象一下所有非叶子结点都有俩孩子但是xx
if(temp->left!=NULL){
if(f==1) flag=false;
q.push(temp->left);
}else f=1;
if(temp->right!=NULL){
if(f==1) flag=false;
q.push(temp->right);
}else f=1;
}
}
int main(){
int n,temp;
cin>>n;
node *tree=NULL;
for(int i=0;i<n;i++){
cin>>temp;
tree=insert(tree,temp);
}
level(tree);
for(int i=0;i<v.size();i++){
if(i!=0) cout<<" ";
cout<<v[i];
}
if(flag) cout<<endl<<"YES";
else cout<<endl<<"NO";
return 0;
}
看一下判断方法错误的踩雷:记住以下不行-,-
测试点34还是23
if(temp->left!=NULL&&temp->right==NULL||temp->right!=NULL&&temp->left==NULL) flag=false;这种错误还是比较好想。
测试点457
if(temp->left==NULL&&temp->right==NULL) kong=true;
if(kong&&temp->left!=NULL||kong&&temp->right!=NULL) flag=false;只有一个叶子节点的