*
有两种方法:
第一种是把结点存在(1 << n)大小的数组里,如果是完全二叉树,那么在1到(1<<n)范围内的所有点进行遍历如果发现有1到n
内有某个点未被赋值那么就不是完全二叉树
第二种是模拟建树,给每个结点编号,如果编号大于n则不是二叉树(可以在建树的时候就编号,也可以层序遍历的时候编号)
第二种比第一种快,内存少
*/
有两种方法:
第一种是把结点存在(1 << n)大小的数组里,如果是完全二叉树,那么在1到(1<<n)范围内的所有点进行遍历如果发现有1到n
内有某个点未被赋值那么就不是完全二叉树
第二种是模拟建树,给每个结点编号,如果编号大于n则不是二叉树(可以在建树的时候就编号,也可以层序遍历的时候编号)
第二种比第一种快,内存少
*/
#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = (1 << 20) + 10;
#define inf 0x3f3f3f3f
struct Node
{
int val = inf;
}tree[N];
void add(int u,int val)
{
if(tree[u].val == inf)
tree[u].val = val;
else
{
if(val > tree[u].val)
add(u << 1,val);
else
add(u << 1 | 1,val);
}
}
int main()
{
int n;
cin >> n;
int x;
int len = (1 << n);
for (int i = 1; i <= n; ++i)
{
cin >> x;
add(1,x);
}
bool flag = true;
for (int i = 1; i < len; ++i)
{
if(tree[i].val == inf)
{
if(i <= n)
flag = false;
}
else
printf("%s%d",i==1?"":" ",tree[i].val);
}
printf("\n");
printf("%s\n",flag ? "YES" : "NO");
}
#include <stdio.h>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;
struct Node
{
Node* left;
Node* right;
int id;
int val;
Node():left(nullptr),right(nullptr),id(0),val(-1){}
Node(Node* u,Node* v,int iid,int vval):left(u),right(v),id(iid),val(vval){}
};
queue<Node*> que;
void bfs(Node* root)
{
int flag = 1;
que.push(root);
while(!que.empty())
{
Node* u = que.front();
que.pop();
if(flag)
flag = 0;
else
cout << " ";
cout << u -> val;
if(u -> left != NULL)
que.push(u -> left);
if(u -> right != NULL)
que.push(u -> right);
}
cout << "\n";
}
int main()
{
int n;
cin >> n;
int x;
int maxx = 1;
cin >> x;
Node* root = new Node(NULL,NULL,1,x);
for (int i = 1; i < n; ++i)
{
cin >> x;
Node* p = root,*q = root;//q是p的前驱
int ID = 1,f = 0;
while(p != NULL)
{
q = p;
if(x > p -> val)
{
p = p -> left;
ID = ID * 2;
f = 0;//左0
}
else
{
p = p -> right;
ID = ID * 2 + 1;
f = 1;//右1
}
}
maxx = max(ID,maxx);
//cout << maxx << endl;
p = new Node(NULL,NULL,ID,x);
if(!f)
q -> left = p;
else
q -> right = p;
}
bfs(root);
//cout << maxx << endl;
if(maxx > n)
cout << "NO" << endl;
else
cout << "YES" << endl;
}