PAT006 Tree Traversals Again
题目:
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
Sample Output:
3 4 2 6 5 1
分析: 主要是根据输入创建一个二叉树,然后进行后续遍历
代码:
#pragma mark -Tree Traversals Again
#include <stdio.h> typedef struct traversalTreeNode {
int value;
struct traversalTreeNode *left;
struct traversalTreeNode *right;
} TraversalTreeNode; int flag; TraversalTreeNode *createTraversalTreeNode(int value)
{
TraversalTreeNode *node = (TraversalTreeNode *)malloc(sizeof(TraversalTreeNode));
node->value = value;
node->left = NULL;
node->right = NULL;
return node;
} void postorderTraversal(TraversalTreeNode *head)
{
if (head) {
postorderTraversal(head->left);
postorderTraversal(head->right); if (flag == ) {
printf("%d", head->value);
flag = ;
} else {
printf(" %d", head->value);
}
}
} int main()
{
int nodeNum = ;
scanf("%d", &nodeNum); int operationCount = * nodeNum;
TraversalTreeNode *a[]; int top = -;
// 第一个节点肯定是PUSH
int index = -;
scanf("%*s %d", &index);
TraversalTreeNode *head = createTraversalTreeNode(index);
a[] = head;
top = ; TraversalTreeNode *popItem = NULL;
for (int i = ; i < operationCount; i++) {
int index = -;
char str[];
scanf("%s", str);
unsigned long len = strlen(str);
if (len >= ) {
scanf("%d", &index);
TraversalTreeNode *newNode = createTraversalTreeNode(index);
if (popItem) {
if (!popItem->left) {
popItem->left = newNode;
} else {
popItem->right = newNode;
}
} else {
if (!a[top]->left) {
a[top]->left = newNode;
} else {
a[top]->right = newNode;
}
} top++;
a[top] = newNode;
popItem = NULL;
} else {
popItem = a[top];
a[top] = NULL;
top--;
}
} flag = ;
postorderTraversal(head);
}
运行结果:

PAT006 Tree Traversals Again的更多相关文章
- Tree Traversals
Tree Traversals 原题链接 常见的二叉树遍历的题目,根据后序遍历和中序遍历求层次遍历. 通过后序遍历和中序遍历建立起一棵二叉树,然后层序遍历一下,主要难点在于树的建立,通过中序遍历和后序 ...
- HDU 1710 二叉树的遍历 Binary Tree Traversals
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu1710(Binary Tree Traversals)(二叉树遍历)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU1710Binary Tree Traversals
HDU1710Binary Tree Traversals 题目大意:给一个树的前序遍历和中序遍历,要求输出后序遍历. (半年前做这道题做了两天没看懂,今天学了二叉树,回来AC了^ ^) 首先介绍一下 ...
- HDU-1701 Binary Tree Traversals
http://acm.hdu.edu.cn/showproblem.php?pid=1710 已知先序和中序遍历,求后序遍历二叉树. 思路:先递归建树的过程,后后序遍历. Binary Tree Tr ...
- 03-树2. Tree Traversals Again (25)
03-树2. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue ...
- HDU 1710-Binary Tree Traversals(二进制重建)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- PAT1086:Tree Traversals Again
1086. Tree Traversals Again (25) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- Binary Tree Traversals(HDU1710)二叉树的简单应用
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
随机推荐
- Android6.0指纹识别开发
近期在做android指纹相关的功能,谷歌在android6.0及以上版本号对指纹识别进行了官方支持.当时在FingerprintManager和FingerprintManagerCompat这两个 ...
- 假设这篇文章也能訪问过万,我的那些朋友就是SB
能和我这个疯子交朋友的一定是神经病
- Python的不同实现
这里的实现指的是符合Python语言规范的Python解释程序以及标准库等.这些实现虽然实现的是同一种语言,但是彼此之间,特别是与CPython之间还是有些差别的. 下面分别列出几个主要的实现. 1. ...
- Some Web API Url Samples
URI Verb Description ...
- HDU 5296 Annoying problem
Annoying problem Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- 安装Vagrant出错 安装Homestead出错失败
安装Vagrant出错 安装Homestead出错 我们也可以在电脑上创建其它文件夹,只需保证创建的文件夹路径跟 Homestead.yaml 文件中的 folders - map 保持一致即 ...
- ZK框架笔记3、窗体组件
<window title="My First window" border="normal" width="200px" closa ...
- 安卓camera拍照时序
转自:http://blog.csdn.net/tankai19880619/article/details/17147125 一.看看调用时序图 1.拍照命令时序图 2.拍照数据回调时序图 二.看看 ...
- C语言中函数和指针的參数传递
近期写二叉树的数据结构实验.想用一个没有返回值的函数来创建一个树,发现这个树就是建立不起来,那么我就用这个样例讨论一下c语言中指针作为形參的函数中传递中隐藏的东西. 大家知道C++中有引用的概念,两个 ...
- oracle经验小节2
1,instr 函数 在Oracle/PLSQL中,instr函数返回要截取的字符串在源字符串中的位置. 语法如下: instr( string1, string2 [, start_position ...