二叉树重构基本问题
#include
#include
using namespace std;
const int MAXN = 29;
struct Node{
char val;
Node *l,*r;
};
char pre[MAXN],in[MAXN];
void postOrder(Node *root){
if(root==NULL)return;
postOrder(root->l);
postOrder(root->r);
printf("%c",root->val);
}
Node* rebuild(int l1,int r1,int l2, int r2){
if(r1val = pre[l1];
//left child
int m = 0,len;
while(in[m]!=cur->val)++m;//找到当前
len = m-l2;//左子树长度
cur->l = rebuild(l1+1,l1+len,l2,m-1);
//right child
cur->r = rebuild(l1+len+1,r1,m+1,r2);
return cur;
}
int main(){
Node*root;
int len;
while(~scanf("%s",pre)){
scanf("%s",in);
len = strlen(pre);
root=rebuild(0,len-1,0,len-1);
postOrder(root);
printf("\n");
}
return 0;
}
简单题, 知道二叉完全树用数组保存的规律即可
#include
using namespace std;
int n,m,sum;
void count(int x){
if(x>n)return;
sum++;
count(x*2);
count(x*2+1);
}
int main(){
while(~scanf("%d %d",&m,&n)){
sum = 0;
count(m);
printf("%d\n",sum);
}
return 0;
}
同上
#include
using namespace std;
int main(){
int x,y;
while(~scanf("%d %d",&x,&y)){
while(x!=y){
if(x>y)x/=2;
else y/=2;
}
printf("%d\n",x);
}
return 0;
}
二叉完全树变种, 简答题
#include
#include
#include
#include
using namespace std;
const int MAXN = 1005;
int arr[MAXN];
int main(){
int n,d,last;
bool flag;
while(~scanf("%d",&n)){
flag = false;
for(int i = 1; i <= n; ++i)scanf("%d",&arr[i]);
scanf("%d",&d);
last = min(n,((int)pow(2,d))-1);
int i=(int)pow(2,d-1);
if(i>last)printf("EMPTY");
else
for(; i <= last; ++i)
if(flag){
printf(" %d",arr[i]);
}else{
printf("%d",arr[i]);
flag = true;
}
printf("\n");
}
return 0;
}