PAT (Advanced Level) 1086. Tree Traversals Again (25) 根据先根遍历数组创建树
2015-07-30 15:56
639 查看
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:
Sample Output:
注意到如果将pop看成数的空结点的话,输入用例只要在后面再加一个pop,该序列就与树的先序遍历一样。
我们可以用0表示空结点,则先根遍历序列转换为1,2,3,0,0,4,0,0,5,6,0,0,0,利用该序列先根遍历创建树即可。
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 Pop
Sample Output:
3 4 2 6 5 1
注意到如果将pop看成数的空结点的话,输入用例只要在后面再加一个pop,该序列就与树的先序遍历一样。
我们可以用0表示空结点,则先根遍历序列转换为1,2,3,0,0,4,0,0,5,6,0,0,0,利用该序列先根遍历创建树即可。
/*2015.7.30cyq*/ #include <iostream> #include <string> #include <vector> #include <fstream> using namespace std; //ifstream fin("case1.txt"); //#define cin fin struct TNode{ int val; TNode *left; TNode *right; TNode(int x):val(x),left(nullptr),right(nullptr){}//构造函数 }; //根据数组先根遍历创建树 void createTree(TNode *&root,const vector<int> &ivec,int &cur){ if(ivec[cur]==0){ cur++; }else{//root指针指向一个new的结点,左右子结点先置为nullptr root=new TNode(ivec[cur]); cur++; createTree(root->left,ivec,cur); createTree(root->right,ivec,cur); } } //后序遍历 void postOrder(TNode *root,vector<int> &result){ if(root!=nullptr){ postOrder(root->left,result); postOrder(root->right,result); result.push_back(root->val); } } int main(){ int N; cin>>N; vector<int> ivec; string s; int x; for(int i=0;i<2*N;i++){ cin>>s; if(s=="Push"){ cin>>x; ivec.push_back(x); }else ivec.push_back(0);//0表示null结点 } ivec.push_back(0);//最后一个null结点 TNode *root=nullptr; int cur=0; createTree(root,ivec,cur); vector<int> result; postOrder(root,result); cout<<result[0]; for(auto it=result.begin()+1;it!=result.end();it++) cout<<" "<<*it; return 0; }
相关文章推荐
- HDU 1867:A + B for you again
- 非阻塞connect() http://blog.csdn.net/shellching/article/details/7663086
- getopt() http://blog.csdn.net/kunikida/article/details/8922402
- Core Animaiton - 8
- HDU 1021 Fibonacci Again
- ubuntu sendmail 发送邮件
- 象棋AI算法(二)
- main真正的形状函数
- SVN commit:remains in tree-conflict错误的解决办法
- details
- Handler sendMessage 与 obtainMessage (sendToTarget)比较
- 有关人工智能的假设
- HDU 1022 Train Problem I
- UVALive 6800 The Mountain of Gold (bellman_ford判负环)
- uva 11374 Airport Express(最短路)
- DataBinder.Eval和Container.DataItem(DataRowView)有什么区别
- Open-air shopping malls(二分半径,两元交面积)
- 基于CLM(Constrained local model)人脸点检测算法
- Easy 2048 Again - ZOJ 3802 像缩进dp
- 怎么提高RailS应用的性能