03-树3 Tree Traversals Again (25 分)

被刻印的时光 ゝ 提交于 2019-12-02 07:00:30

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 (≤) which is the total number of nodes in a tree (and hence the nodes are numbered from 1 to N). Then 2 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
#include<cstdio>  #include<cstring>  #include<stack>  using namespace std;  const int maxn = 50;    struct Node  {      int data;      Node *lchild, *rchild;  };    int in[maxn] = {0}, pre[maxn] = {0};  int num = 0;    Node*  createTree(int preL, int preR, int inL, int inR);  void postOrder(Node *root,int n);    int main()  {      int n;      scanf("%d",&n);            int x;      int preIndex = 0, inIndex = 0;      char str[5];      stack<int> s;            for (int i = 0; i < 2*n; i++)      {          getchar();          scanf("%s",str);          if ( 0 == strcmp(str,"Push"))          {              scanf("%d",&x);              s.push(x);              pre[preIndex++] = x;          }          else          {              x = s.top();              s.pop();              in[inIndex++] = x;          }      }            Node *root = createTree(0,n-1,0,n-1);      postOrder(root,n);      return 0;  }    Node*  createTree(int preL, int preR, int inL, int inR)  {      if (preL > preR)      {          return NULL;      }            Node *root = new Node;      root->data = pre[preL];            int k;      for (k = inL; k <= inR; k++)      {          if (in[k] == pre[preL])          {              break;          }      }            int numLeft = k - inL;      root->lchild = createTree(preL+1, preL+numLeft, inL, k-1);      root->rchild = createTree(preL+numLeft+1, preR, k+1, inR);      return root;  }    void postOrder(Node *root,int n)  {      if (root == NULL)      {          return;      }      postOrder(root->lchild,n);      postOrder(root->rchild,n);      printf("%d",root->data);            num++;      if (num < n)      {          printf(" ");      }  }

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!