1086. Tree Traversals Again (25)

题目链接:http://www.patest.cn/contests/pat-a-practise/1086
题目:

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.

1086. Tree Traversals Again (25)_第1张图片
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

分析:
思路:构建一个stack,其中其top就是当前节点,后添加的节点是其孩子,如果左孩子非空就添加到右孩子。
AC代码:
#include<cstdio>
#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 nn){
 stack<Node*>Node_Stack;
 Node* ret = new Node();
 string str_tmp;
 cin >> str_tmp;
 int i_tmp;
 cin >> i_tmp;
 ret->data = i_tmp;//先读取第一个元素
 Node* curNode = ret;
 Node_Stack.push(ret);
 while (--nn){//因为已经少一个了,所以--nn
  string type;
  cin >> type;
  if (type == "Push"){
   int num_push;
   cin >> num_push;
   Node* newNode = new Node(num_push);
   if (curNode->lchild == NULL)
    curNode->lchild = newNode;
   else
    curNode->rchild = newNode;
   Node_Stack.push(newNode);
   curNode = newNode;
  }
  else if (type == "Pop"){
   curNode = Node_Stack.top(); //*特别注意当前节点是pop出来的节点
   Node_Stack.pop();
  }
 }
 return ret;
}
void postOrder(Node* root){//后续遍历输出
 if (root->lchild != NULL)postOrder(root->lchild);
 if (root->rchild != NULL)postOrder(root->rchild);
 static bool firstFlag = true;//设置标签位,看是否是第一次输出,为了最后的空格格式化,注意这里需要static
 if (firstFlag){
  cout << root->data;
  firstFlag = 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);//有2n组数据输入
 postOrder(root);
 return 0;
}


截图:
1086. Tree Traversals Again (25)_第2张图片
——Apie陈小旭

你可能感兴趣的:(1086. Tree Traversals Again (25))