An inorder binary tree traversal can be implemented in a non-recursive way with a stack. For example, suppose that when a 6-node binary tree (with the keys numbered from 1 to 6) is traversed, the stack operations are: push(1); push(2); push(3); pop(); pop(); push(4); pop(); pop(); push(5); push(6); pop(); pop(). Then a unique binary tree (shown in Figure 1) can be generated from this sequence of operations. Your task is to give the postorder traversal sequence of this tree.
Figure 1
Input Specification:
Each input file contains one test case. For each case, the first line contains a positive integer N (<=30) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2N lines follow, each describes a stack operation in the format: "Push X" where X is the index of the node being pushed onto the stack; or "Pop" meaning to pop one node from the stack.
Output Specification:
For each test case, print the postorder traversal sequence of the corresponding tree in one line. A solution is guaranteed to exist. All the numbers must be separated by exactly one space, and there must be no extra space at the end of the line.
Sample Input:6 Push 1 Push 2 Push 3 Pop Pop Push 4 Pop Pop Push 5 Push 6 Pop PopSample Output:
3 4 2 6 5 1
根据输入获得获得中序遍历和前序遍历,之后递归建立二叉树,再后续遍历获得结果!
#include<iostream> #include<vector> #include<cstring> #include<stack> using namespace std; vector<int>vecPre, vecInorder,vecPost; struct Node { Node *lChild; Node *rChild; int ID; }; int findRootPos(int istart, int iend, int pstart) { int pos = istart; for (int i = istart; i <= iend; ++i) { if (vecInorder[i] == vecPre[pstart]) pos = i; } return pos; } void createTree(int pstart,int pend,int istart,int iend,Node *&root) { if (istart > iend || pstart > pend) return; if (!root) { root = new Node(); root->ID = vecPre[pstart]; } int pos = findRootPos(istart,iend,pstart); createTree(pstart+1,pstart+pos-istart,istart,pos-1,root->lChild); createTree(pend-iend+pos+1,pend,pos+1,iend,root->rChild); } void postOrder(Node *root) { if (root) { postOrder(root->lChild); postOrder(root->rChild); vecPost.push_back(root->ID); } } int main() { int N, id; char input[5]; //vector<int>vecorder;//1 for push,0 for pop stack<int> s; Node *root = NULL; scanf("%d", &N); for (int i = 0; i < 2 * N; ++i) { scanf("%s", input); //cout << strcmp(input, "Pop") << endl; if (strcmp(input, "Pop") == 0) { int temp = s.top(); s.pop(); vecInorder.push_back(temp); } else { scanf("%d", &id); s.push(id); vecPre.push_back(id); } } createTree(0, N - 1, 0, N - 1, root); postOrder(root); for (int i = 0; i < vecPost.size()-1; ++i) { printf("%d ",vecPost[i]); } printf("%d",vecPost[vecPost.size()-1]); return 0; }