第六周刷题随笔
1.洛谷P1111修复公路,忘记了M的大小才是排序的大小,搞成了N去了,虽然通过RE猜到了一丢丢,但是还是拖累了好久,洛谷高性能题是不是都是卡数据,只有减减枝才能过,嘤嘤嘤。
2.洛谷1087FBI树,这道题在递归的时候忘记了二分的规则,mid = (begin + end) / 2, 而不是end / 2,一定要切记,切记,切记,切记,切记。
3.洛谷1030求先序排列, 这道题记得后/先序排列的位置和中序不一样,因为每次后序要去掉最后一个,先序要去掉第一个,中序要去掉中间那个,所以先后中序递归时不能简简单单的找到中间位置i,然后,起始到i-1,i+1到末尾,而是应该在中序排列中记录从起始到i的个数,然后其他序列递归时要传起始以及起始加个数,而不是i-1的位置!!!!!
#include <stdio.h>
#include <string.h>
char mid[10], aft[10];
struct tree{
char data;
tree* left;
tree* right;
}root;
tree* creat(int m_f, int m_l, int a_f, int a_l)
{
if(m_f > m_l)
return NULL;
tree* root = new tree;
root->data = aft[a_l];
int i = m_f;
while(mid[i] != aft[a_l])
i++;
root->left = creat(m_f, i - 1, a_f, a_f + (i - m_f) - 1); //仔细推测为什么后序直接a_f到i - 1不行!!!
root->right = creat(i + 1, m_l, a_f + (i - m_f), a_l - 1);
return root;
}
void print(tree* root)
{
if(root == NULL)
return;
printf("%c", root->data);
print(root->left);
print(root->right);
}
int main(void)
{
scanf("%s", &mid);
scanf("%s", &aft);
int r = strlen(aft) - 1;
tree* root = creat(0, r, 0, r);
print(root);
return 0;
}
4.洛谷P1305 新二叉树:新开在函数体内部的指针一定要先清零,否则未赋值并不是NULL;

浙公网安备 33010602011771号