1044. Shopping in Mars (25)解题报告
2016-10-28 16:56
344 查看
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstdlib> #include <iostream> struct node { int data; struct node *left, *right, *parent; }; node *rebuild1(int left1, int right1, int left2, int right2); node *rebuild2(int left1, int right1, int left2, int right2); void posttraversal(node *root); void deletree(node *root); int cmp1(const void *v1, const void *v2) { return *((int *)v1) - *((int *)v2); } int cmp2(const void *v1, const void *v2) { return *((int *)v2) - *((int *)v1); } int find1(int aim, int arr[], int begin, int end) { int i; i = begin; while (i <= end) { if (arr[i] == aim) { return i; } i++; } return -1; } int find2(int aim, int arr[], int begin, int end) { int i; i = end; while (i >= begin) { if (arr[i] == aim) { return i; } i--; } return -1; } int arr1[1000], arr2[1000], arr3[1000]; bool flag1 = true, flag2 = true; int main(void) { int n, i; scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%d", arr1 + i); arr2[i] = arr3[i] = arr1[i]; } qsort(arr2, n, sizeof(int), cmp1); qsort(arr3, n, sizeof(int), cmp2); node *root1, *root2; root1 = rebuild1(0, n - 1, 0, n - 1); root2 = rebuild2(0, n - 1, 0, n - 1); if (flag1) { puts("YES"); posttraversal(root1->left); posttraversal(root1->right); printf("%d\n", root1->data); } else if (flag2) { puts("YES"); posttraversal(root2->left); posttraversal(root2->right); printf("%d\n", root2->data); } else { puts("NO"); } deletree(root1); deletree(root2); return 0; } node *rebuild1(int left1, int right1, int left2, int right2) { if (left1 > right1) { return nullptr; } else if (left1 == right1) { if (arr1[left1] != arr2[left2] || right2 != left2) { flag1 = false; return nullptr; } node *tmp = new node; tmp->data = arr1[left1]; tmp->left = nullptr; tmp->right = nullptr; return tmp; } else if (right1 - left1 == right2 - left2) { node *tmp = new node; tmp->data = arr1[left1]; int index = find1(arr1[left1], arr2, left2, right2); if (index == -1) { flag1 = false; return nullptr; } tmp->left = rebuild1(left1 + 1, left1 + index - left2, left2, index - 1); tmp->right = rebuild1(left1 + index - left2 + 1, right1, index + 1, right2); return tmp; } else { flag1 = false; return nullptr; } } node *rebuild2(int left1, int right1, int left2, int right2) { if (left1 > right1) { return nullptr; } else if (left1 == right1) { if (arr1[left1] != arr3[left2] || right2 != left2) { flag2 = false; return nullptr; } node *tmp = new node; tmp->data = arr1[left1]; tmp->left = nullptr; tmp->right = nullptr; return tmp; } else if (right1 - left1 == right2 - left2) { node *tmp = new node; tmp->data = arr1[left1]; int index = find2(arr1[left1], arr3, left2, right2); if (index == -1) { flag2 = false; return nullptr; } tmp->left = rebuild2(left1 + 1, left1 + index - left2, left2, index - 1); tmp->right = rebuild2(left1 + index - left2 + 1, right1, index + 1, right2); return tmp; } else { flag2 = false; return nullptr; } } void posttraversal(node *root) { if (!root) { return; } else { posttraversal(root->left); posttraversal(root->right); printf("%d ", root->data); return; } } void deletree(node *root) { if (!root) { return; } else { deletree(root->left); deletree(root->right); free(root); return; } }
相关文章推荐
- PAT 1044. Shopping in Mars (25)
- 1044. Shopping in Mars (25)
- PAT (Advanced Level) Practise 1044 Shopping in Mars (25)
- PAT 1044. Shopping in Mars (25)
- PAT 1044. Shopping in Mars (25)(子序列分割问题,题目不错)
- 1044. Shopping in Mars (25)
- 1044. Shopping in Mars (25)
- PAT (Advanced Level) 1044. Shopping in Mars (25) 找符合要求的连续子数组,贪心
- 1044. Shopping in Mars (25)
- PAT A 1044. Shopping in Mars (25)
- 1044. Shopping in Mars (25)
- 1044. Shopping in Mars (25)
- PAT(A) - 1044. Shopping in Mars (25)
- 1044. Shopping in Mars (25) 尺取法
- PAT 1044. Shopping in Mars (25)
- PAT 1044. Shopping in Mars (25) 求区间和,连续序列和
- 1044. Shopping in Mars (25)
- PAT_A 1044. Shopping in Mars (25)
- PAT 1044. Shopping in Mars (25)
- 1044. Shopping in Mars (25)