PAT甲級1119,1086,1020總結
阿新 • • 發佈:2019-01-02
1086已知中序先序求後序
#include<iostream> #include<queue> #include<stack> #include<string> #include<string.h> #include<cstring> using namespace std; int pre[30]; int ino[30]; int flag = 1; struct TreeNode { int data; TreeNode* lefttree; TreeNode* righttree; }; TreeNode *createTree(int pl, int pr, int il, int ir) { if (pl > pr) return NULL; int i = 0; for (i = il; ino[i] != pre[pl]; i++); TreeNode *tree = (TreeNode*)malloc(sizeof(TreeNode)); tree->data = pre[pl]; tree->lefttree = createTree(pl + 1, pl + i - il, il, i - 1); tree->righttree = createTree(pl + i - il + 1, pr, i + 1, ir); if (flag == 1) { printf("%d", tree->data); flag = 2; } else { printf(" %d", tree->data); } return tree; } int main() { int n, i = 0, j = 0;; stack<int> s; char str[4]; scanf("%d", &n); scanf("%s %d", &str, &pre[i]); s.push(pre[0]); i++; while (j < n) { scanf("%s", &str); if (string(str) == "Push") { scanf("%d", &pre[i]); s.push(pre[i]); i++; } else if (string(str) == "Pop") { ino[j] = s.top(); s.pop(); j++; } } TreeNode *root = createTree(0, n - 1, 0, n - 1); return 0; }
1020已知中序後序求先序
#include<iostream> #include<queue> using namespace std; int pos[30]; int ino[30]; struct TreeNode { int data; TreeNode* lefttree; TreeNode* righttree; }; TreeNode *createTree(int pl,int pr,int il,int ir) { if (pl > pr) return NULL; TreeNode* tree; int i = 0; for (i = il; i < ir, pos[pr] != ino[i]; i++); tree = (TreeNode*)malloc(sizeof(TreeNode)); tree->data = pos[pr]; tree->lefttree = createTree(pl, pl + i - 1 - il, il, i - 1); tree->righttree = createTree(pl + i - il, pr - 1, i + 1, ir); return tree; } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%d", &pos[i]); } for (int i = 0; i < n; i++) { scanf("%d", &ino[i]); } TreeNode *root=createTree(0,n-1,0,n-1); queue<TreeNode*> que; que.push(root); printf("%d", root->data); int j = 0; while (!que.empty()) { TreeNode *t = que.front(); if (j != 0 && t != NULL) { printf(" %d", t->data); } j = 2; que.pop(); if (t->lefttree != NULL) { que.push(t->lefttree); } if (t->righttree != NULL) { que.push(t->righttree); } } return 0; }
1119已知先序後序求中序
// ConsoleApplication2.cpp : 定義控制檯應用程式的入口點。 #include "stdafx.h" #include<iostream> #include<queue> #include<stack> #include<string> #include<string.h> #include<cstring> #include<vector> using namespace std; int pre[30]; int pos[30]; int ino[30]; int k = 0; int CreateTree(int l1,int r1,int l2,int r2) { if (l1 > r1) return 0;//如果沒有某一子節點,則中序遍歷不唯一 if (l1 == r1)//如果沒有任意子節點,則在這裡截胡,直接存入陣列返回1 { ino[k++] = pre[l1]; return 1; } int i = 0; for ( i = l2; pre[l1+1] != pos[i]; i++);//找到自己子節點中的根節點 int ok = 1; ok &= CreateTree(l1 + 1, l1 + 1 + i - l2, l2, i);//在後序中,找到的該根節點及其之前的節點為當前結點的左孩子 ino[k++]=pre[l1];//中序遍歷嘛,這裡存入資料 ok &= CreateTree(l1 + 2 + i - l2, r1, i + 1, r2 - 1);//在後序中,找到的該根節點之後的節點,不包括該根節點,為當前節點的右孩子(l1+2+i-l2是左邊界,該邊界由i定義,而右邊界為r1,與i無關,所以前面return0的判斷條件那麼寫,就是我不管你有沒有左右節點,我都往下傳,判斷沒有則返回0) return ok; } int main() { while (1) { int n; scanf("%d", &n); for (int i = 1; i <=n; i++) { scanf("%d", &pre[i]); } for (int i = 1; i <= n; i++) { scanf("%d", &pos[i]); } int ok=CreateTree(1, n, 1, n); ok ? printf("Yes") : printf("No"); printf("\n"); for (int i = 0; i < k; i++) { if (i==0) { printf("%d", ino[i]); } else { printf(" %d", ino[i]); } } } return 0; }