国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

1119. Pre- and Post-order Traversals (30) (先序+后序,確定二叉樹?)

2019-11-08 18:29:42
字體:
來源:轉載
供稿:網友

題目地址

https://www.patest.cn/contests/pat-a-PRactise/1119

題目描述

Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can be determined by a given pair of postorder and inorder traversal sequences, or preorder and inorder traversal sequences. However, if only the postorder and preorder traversal sequences are given, the corresponding tree may no longer be unique.

Now given a pair of postorder and preorder traversal sequences, you are supposed to output the corresponding inorder traversal sequence of the tree. If the tree is not unique, simply output any one of them.

Input Specification:

Each input file contains one test case. For each case, the first line gives a positive integer N (<=30), the total number of nodes in the binary tree. The second line gives the preorder sequence and the third line gives the postorder sequence. All the numbers in a line are separated by a space.

Output Specification:

For each test case, first printf in a line “Yes” if the tree is unique, or “No” if not. Then print in the next line the inorder traversal sequence of the corresponding binary tree. If the solution is not unique, any answer would do. It is guaranteed that at least one solution exists. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

Sample Input 1:

71 2 3 4 6 7 52 6 7 4 5 3 1

Sample Output 1:

Yes2 1 6 4 7 3 5

Sample Input 2:

41 2 3 42 4 3 1

Sample Output 2:

No2 1 3 4

ac思路

先序+后序 無法判斷二叉樹的唯一性

比如有兩個節點的時候,

先序: 根 左后序: 左 根

或者

先序:根 右后序:右 根

所以 需要明確是否會出現上述情況

先序第一個節點是根節點,緊接著第二個節點是根節點的左節點還是右節點了?

在后序中查找 先序中的第二個節點

如果后序中的該位置 到 最后(也就是后序中根節點位置) 還有其他數的話,可以判斷,先序中第二個節點肯定左節點(反證法。。。)1 2 3 42 4 3 1

1 為 根,2 接著,2在后序中,與1隔著兩個數,所以2一定是1的左節點; 3,4成為1的右子樹節點

1 / 2當中間沒有數的時候,就不確定了 例如 3,4 1 / /2 3 / 4

還是

1 / /2 3 / 4

ac代碼1

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#include <string>#include <vector>#include <queue>#include <algorithm>#include <sstream>#include <list>#include <stack> #include <map> #include <set> #include <iterator> #include <unordered_map>using namespace std;const int INF = 0x7fffffff;typedef long long int LL;const int N = 10000 + 5;int n;vector<int> preOrder;vector<int> postOrder;bool flag;typedef struct node{ int val; struct node* left; struct node* right; node(int _val = -1) { val = _val; left = NULL; right = NULL; }}Bnode;Bnode* Create(int preL, int preR, int postL, int postR){ if(preL > preR) return NULL; Bnode* root = new Bnode(preOrder[preL]); if(preL == preR) return root; // 后序找 pre[preL + 1] int k; for (k = postL; k < postR; k++) { if (postOrder[k] == preOrder[preL + 1]) break; } if(postR - k - 1 > 0) { root->left = Create(preL + 1, preL + 1 + k - postL , postL, k); root->right = Create(preL + 1 + k - postL + 1, preR, k+1, postR -1); }else{ flag = false; root->right = Create(preL + 1, preR, postL, postR - 1); } return root;}vector<int> in;void inOrder(Bnode* root){ if(root != NULL) { inOrder(root->left); in.push_back(root->val); inOrder(root->right); }}int main(){ //freopen("in.txt", "r" , stdin); while(scanf("%d", &n) != EOF) { preOrder.clear(); postOrder.clear(); int tmp; for(int i = 1; i <= n; i++) { scanf("%d", &tmp); preOrder.push_back(tmp); } for(int i = 1; i <= n; i++) { scanf("%d", &tmp); postOrder.push_back(tmp); } flag = true; Bnode* root = Create(0, n-1, 0, n-1); if(flag) { printf("Yes/n"); }else{ printf("No/n"); } in.clear(); inOrder(root); printf("%d", in[0]); for(int i=1;i<n;i++) { printf(" %d",in[i]); } printf("/n"); } return 0;}

ac代碼2

#include <cstdio>#include <cstdlib>#include <cmath>#include <cstring>#include <iostream>#include <string>#include <vector>#include <queue>#include <algorithm>#include <sstream>#include <list>#include <stack> #include <map> #include <set> #include <iterator> #include <unordered_map>using namespace std;const int INF = 0x7fffffff;typedef long long int LL;const int N = 10000 + 5;int n;vector<int> preOrder;vector<int> postOrder;bool flag;typedef struct node{ int val; struct node* left; struct node* right; node(int _val = -1) { val = _val; left = NULL; right = NULL; }}Bnode;Bnode* Create(int preL, int preR, int postL, int postR){ if(preL > preR) return NULL; Bnode* root = new Bnode(preOrder[preL]); if(preL == preR) return root; int k; for (k = preL + 1; k <= preR; k++) { if (preOrder[k] == postOrder[postR - 1]) break; } // post[postR -1]是根節點post[postR]的 左或者右 節點 // 如果先序中,post[postR-1] 前面還有其他節點的話,可以判斷其是根節點的左子樹,是確定的 // 否則, post[postT-1] 可以是根節點的左或者右節點 if( k - preL - 1 > 0) { root->left = Create(preL + 1, k-1, postL, postL + k - preL -2); root->right = Create(k, preR, postL + k - preL -1, postR -1); }else{ flag = false; root->right = Create(k, preR, postL + k - preL - 1, postR - 1); } return root;}vector<int> in;void inOrder(Bnode* root){ if(root != NULL) { inOrder(root->left); in.push_back(root->val); inOrder(root->right); }}int main(){ freopen("in.txt", "r" , stdin); while(scanf("%d", &n) != EOF) { preOrder.clear(); postOrder.clear(); int tmp; for(int i = 1; i <= n; i++) { scanf("%d", &tmp); preOrder.push_back(tmp); } for(int i = 1; i <= n; i++) { scanf("%d", &tmp); postOrder.push_back(tmp); } flag = true; Bnode* root = Create(0, n-1, 0, n-1); if(flag) { printf("Yes/n"); }else{ printf("No/n"); } in.clear(); inOrder(root); printf("%d", in[0]); for(int i=1;i<n;i++) { printf(" %d",in[i]); } printf("/n"); } return 0;}

參考思路 小菜在切題 http://www.cnblogs.com/demian/p/6103285.html


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 雅江县| 泗水县| 湛江市| 平江县| 米易县| 定南县| 公主岭市| 莆田市| 周宁县| 门头沟区| 汨罗市| 广汉市| 延庆县| 辽宁省| 彩票| 克东县| 吉木乃县| 长治县| 襄垣县| 六枝特区| 扶风县| 马尔康县| 离岛区| 安国市| 南溪县| 新巴尔虎左旗| 静海县| 安陆市| 盘山县| 济阳县| 镇巴县| 洛南县| 类乌齐县| 满城县| 灵寿县| 定边县| 启东市| 康乐县| 拜泉县| 逊克县| 秭归县|