1086. Tree Traversals Again
2015-11-30 21:00
549 查看
1086. Tree Traversals Again (25)
时间限制200 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
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 Pop
考查:二叉树的遍历,递归与非递归形式
#include<stdio.h> #include<iostream> #include<stack> #include<string> using namespace std; struct Node { int data; Node *lchild; Node *rchild; Node(int num):data(num), lchild(NULL), rchild(NULL){} Node():lchild(NULL), rchild(NULL){} }; Node* createTree(int n) { stack<Node*> s; Node * ret = new Node(); string str_tmp; cin>>str_tmp; int i_tmp; cin>>i_tmp; ret->data = i_tmp; Node* cur_node = ret; s.push(ret); while(-- n) { string type; cin>>type; if(type == "Push") { int num_push; cin>>num_push; Node *new_node = new Node(num_push); if(cur_node->lchild == NULL) cur_node->lchild = new_node; else cur_node->rchild = new_node; s.push(new_node); cur_node = new_node; } else if(type == "Pop") { cur_node = s.top(); s.pop(); } } return ret; } void postOrder(Node *root) { if(root->lchild != NULL) postOrder(root->lchild); if(root->rchild != NULL) postOrder(root->rchild); static bool flag = true; if(flag) { cout<<root->data; flag = false; } else cout<<" "<<root->data; } int main() { freopen("F://Temp/input.txt", "r", stdin); int n; cin>>n; if(n == 0) return 0; Node *root = createTree(2*n); postOrder(root); return 0; }
[/code]
相关文章推荐
- 【Swing】paint与paintComponent的区别
- hdu3394--Railway(点的双连通分量)
- Uva514-Rails(基本栈)
- 【LEETCODE】70-Climbing Stairs
- 找不到或无法加载主类(Exception in thread "main
- C++拷贝构造函数详解 http://blog.csdn.net/lwbeyond/article/details/6202256
- 图标课AI
- Redhat7 配置软RAID(mdadm)
- BFS预处理 hihoCoder1251 Today Is a Rainy Day
- linker command failed with exit code 1 (use -v to see invocation)
- ORA-00054:资源正忙,要求指定NOWAIT
- Cowardly refusing to `sudo brew update` or failure
- 出现( linker command failed with exit code 1)错误总结汇总
- 分治法求最近点对
- IBM AIX 系统Lpar学习以及资源调整
- paintEvent()重绘事件
- 警告:Block的Retain Cycle的解决方法
- IPC-Binder连接池
- 【索引】2015 Multi-University Training Contest
- HTML5 Canvas渐进填充与透明(摘自 http://blog.csdn.net/jia20003/article/details/9251893)