二叉树的先序遍历题目,不需要建立二叉树,用两个一维数组模拟像素的位置就行了,最后归并两个一维数组中的内容就行了。调试还真花了点时间,递归程序一定要谨慎地写代码,要不然很容易出现漏洞。
#include <stdio.h>
#include <string.h>
#include <math.h>
#define MAX_LEN 10000
char buffer1[MAX_LEN];
char buffer2[MAX_LEN];
unsigned char black1[1025];
unsigned char black2[1025];
int buffer_index;
//start_addr是当前的树的第一个叶子节点的起始下标
void pre_travel(char *buffer, int depth, int start_addr)
{
int aver; //四个子树里面每个子树涵盖多少个点
aver = 1024/(int)pow(4.0, depth);
if(buffer[buffer_index] == 'f')
{
if(buffer == buffer1)
memset(black1+start_addr, 1, aver);
else if(buffer == buffer2)
memset(black2+start_addr, 1, aver);
return;
}
if(buffer[buffer_index] == 'e')
{
return;
}
if(buffer[buffer_index] == 'p')
{
buffer_index++;
pre_travel(buffer, depth+1, start_addr);
buffer_index++;
pre_travel(buffer, depth+1, start_addr+aver/4);
buffer_index++;
pre_travel(buffer, depth+1, start_addr+aver/4*2);
buffer_index++;
pre_travel(buffer, depth+1, start_addr+aver/4*3);
}
}
void func()
{
int i, count;
memset((void*)black1, 0, 1025);
memset((void*)black2, 0, 1025);
buffer_index = 0;
pre_travel(buffer1, 0, 1);
buffer_index = 0;
pre_travel(buffer2, 0, 1);
count = 0;
for(i=1; i<=1024; i++)
if(black1[i] || black2[i])
count ++;
printf("There are %d black pixels.\n", count);
}
int main(void)
{
int n, i;
//freopen("input.dat", "r", stdin);
scanf("%d", &n);
getchar();
for(i=0; i<n; i++)
{
gets(buffer1);
gets(buffer2);
func();
}
return 0;
}