第六周刷题随笔
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;