【c3】二叉树应用题x4

题目:二叉树遍历

二叉树重构基本问题

#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;
}

你可能感兴趣的:(算法编程)