Uva536 Tree Recovery二叉樹重建(先序和中序確定二叉樹,後序輸出)
阿新 • • 發佈:2018-11-06
題目大意:給定二叉樹先序和中序遍歷,輸出二叉樹後序遍歷。
方法:將英文字母對映為數字,利用陣列儲存,先序第一個節點是父節點,然後再從中序遍歷中找到位置。注意邊界。程式碼也很簡單一次ac。
#include<iostream> #include <string> #include <string.h> using namespace std; string preorder,inorder; int lefttree[1000], righttree[1000]; int build(int preleft,int preright,int inleft,int inright) { if (preleft> preright)return -1; int index = inorder.find(preorder[preleft],inleft); int l1 = index - inleft; int r1 = inright - index; lefttree[preorder[preleft] - 'A']=build( preleft + 1, preleft + l1, inleft, index - 1); righttree[preorder[preleft] - 'A']=build( preleft + l1 + 1, preleft + l1 + r1, index+1, inright); return preorder[preleft]-'A'; } void printTree(int root) { if (root == -1)return; printTree(lefttree[root]); printTree(righttree[root]); cout << (char)(root + 'A'); } int main() { while (cin >> preorder && cin >> inorder) { memset(righttree, -1, sizeof(righttree)); memset(lefttree, -1, sizeof(lefttree)); build(0, preorder.length()-1, 0, preorder.length()-1); printTree(preorder[0]-'A'); cout << endl; } return 0; }