1086 Tree Traversals Again
这是一道二叉树遍历模板题。
大致题意就是给出 用栈模拟二叉树的中序遍历过程,推断出push的全部元素是先序序列,pop的全部元素是中序序列,最后 根据 先序+中序 = 二叉树,输出二叉树的后序序列。
注意点:如果使用 getline(cin,str),必须要考虑 元素值大于 10的情况,不然 最后一个测试点过不去。
1 #include<iostream> 2 #include<stack> 3 using namespace std; 4 const int maxn = 200; 5 struct Node { 6 int data; 7 Node* lchild; 8 Node* rchild; 9 }; 10 11 int n;//结点个数 12 int pre[maxn] ,in[maxn];//先序序列、后序序列 13 14 Node* create(int preL,int preR,int inL,int inR) { 15 //第一步,确定递归边界 16 if(inL > inR) return NULL; 17 //第二步,保存根节点 18 Node* root = new Node; 19 root->data = pre[preL]; 20 //第三步,用根节点划分中序序列,求出左子树结点的个数 21 int k,leftNum = 0; 22 for(k = inL; k <= inR; ++k) 23 if(in[k] == pre[preL]) break; 24 leftNum = k-inL; 25 //第四步,确定左子树的先序序列和中序序列,确定右子树的先序序列和中序序列 26 root->lchild = create(preL+1,preL+leftNum,inL,k-1); 27 root->rchild = create(preL+leftNum+1,preR,k+1,inR); 28 return root; //又忘记了这个小可爱~~ 29 } 30 31 int num = 0; 32 void postorder(Node* root) { //后序遍历 33 if(root == NULL) return ; 34 postorder(root->lchild); 35 postorder(root->rchild); 36 if(num > 0) printf(" "); 37 printf("%d",root->data); 38 num++; 39 } 40 41 int main() { 42 cin>>n; 43 string str; 44 int preIndex = 0,inIndex = 0,x; 45 stack<int> st; 46 for(int i = 0; i < 2*n; ++i) { //出栈入栈 2n次 47 cin>>str; 48 if(str == "Pop") { 49 in[preIndex++] = st.top();//中序序列 50 st.pop(); 51 } else { 52 cin>>x; 53 pre[inIndex++] = x;//先序序列 54 st.push(x); 55 } 56 } 57 Node* root = create(0,n-1,0,n-1); 58 postorder(root); 59 return 0; 60 }