您的位置:首页 > 大数据 > 人工智能

1086.Tree Traversals Again

2015-08-10 13:26 369 查看
Tree Traversals Again (25)

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.



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

结题思路:

根据输入,构建二叉树。

每当上一个读入的OP为Push,或者第一次读入Push时,当前的Push操作在当前节点的左子树插值

每当上一个命令的OP为Pop ,当前的Push操作在当前节点的右子树插值

建树完成后,后序遍历输出即可。

需要注意:根节点的索引并不确定。考虑空树跟只有一个节点的情况

#include<iostream>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cstdlib>
#include<stack>
#define size 35
using namespace std;
struct node{
int left;
int right;
};
stack<int> s;
node tree[size];//数组存储树
void addChild(int root,int child,bool flag)
{
if(child==root)
return;
if(flag)//left
{
tree[root].left=child;
}
else
{
tree[root].right=child;
}
}
void postOrder(int root,int first)
{
if(root==-1)
return ;
postOrder(tree[root].left,first);
postOrder(tree[root].right,first);
if(root==first)
cout<<root<<endl;
else
cout<<root<<" ";
}
void postOrderOutTree(int root)
{
if(root==0||root==-1)
return ;
postOrder(root,root);
}
int main()
{
string op="";//操作符
int cur;//当前节点的索引值
int nodeNum;//树节点个数
int nodeValue;//插入的树节点的值
bool flag;//左右子树的标识符
int root;//根节点的位置
bool first=true;//根节点的标示符
while(!s.empty())//栈初始化
s.pop();
for(int i=0;i<size;++i)//数组存储树初始化
tree[i].left=tree[i].right=-1;
cin>>nodeNum;
cur=0;
root=0;
flag=true;//在0节点的左子树处插入
for(int i=0;i<nodeNum*2;++i)//建树
{
cin>>op;
if(op=="Push")//节点入栈
{
cin>>nodeValue;
if(first)//记录根节点的索引值
{
root=nodeValue;
first=false;
}
s.push(nodeValue);
addChild(cur,nodeValue,flag);//flag 1 左子树 0 右子树,给cur节点添加孩子nodeValue
cur=nodeValue;//修改当前节点的索引值
flag=true;
}
else
{
cur=s.top();//修改当前节点的索引值
s.pop();
flag=false;//在当前节点的右子树插入
}
}
postOrderOutTree(root);//后序遍历,并输出
//system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: