• Tree Traversals Again(根据前序,中序,确定后序顺序)


    题目的大意是:进行一系列的操作push,pop。来确定后序遍历的顺序

    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 t

    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
    思路:push过程就是前序遍历,pop过程就是中序遍历,再写一个根据前序和中序遍历确定后序遍历的算法。
     2.取先序序列中的第一个元素,该元素为根结点
        3.根据根结点在中序序列中查找根结点的位置,从而得到该树左子树结点个数(L)与右子树的结点个数(R)
        4.在后序序列数组中,第0到第L个元素为左子树,第L+1到第L+R个元素为右子树,最后一个元素为根结点
     
     
    #include<cstdio>
    #include<stack>
    #include<iostream>
    #include<string>
    using namespace std;
    
    #define MAX 30
    int preOrder[MAX];
    int inOrder[MAX];
    int postOrder[MAX];
    
    
    //根据前序和中序划分,来确定后序遍历。前序的第一个数字为根结点,
    //找到根结点root在中序数组位置,中序数组中root左边为根结点左子树,右边为右子树
    void Solve(int preL,int inL,int postL,int n){   
      if(n==0)return;
      if(n==1){
        postOrder[postL]=preOrder[preL]; 
      }
      int root=preOrder[preL];
      postOrder[postL+n-1]=root;
      int i,R,L;
      for(i=0;i<n;i++){
        if(root==inOrder[inL+i])break;
      }
      L=i,R=n-i-1;                  //L为左子树结点数目,R为右子树结点数目
      Solve(preL+1,inL,postL,L);    //确定后序数组中根结点root左边的排列顺序
      Solve(preL+L+1,inL+L+1,postL+L,R);
    }
    
    int main(){
      int n;
      for(int i=0;i<MAX;i++){
        preOrder[i]=0;
        inOrder[i]=0;
        postOrder[i]=0;
      }
      stack<int> s;
      cin>>n;
      string str;
      int data;
      int index=0,pos=0;
      for(int i=0;i<2*n;i++){
        cin>>str;
        if(str=="Push"){      //push代表前序遍历
         cin>>data;
        s.push(data);
          preOrder[index++]=data;
        }else if(str=="Pop"){ //pop为中序遍历
          inOrder[pos++]=s.top();
          s.pop();
        }
      }
      Solve(0,0,0,n);
      for(int i=0;i<n;i++){
        if(i>0)printf(" ");
        printf("%d",postOrder[i]);
      }
      return 0;
    }
  • 相关阅读:
    Channel使用技巧
    Flask开发技巧之异常处理
    后端开发使用pycharm的技巧
    python单元测试
    Docker入门介绍
    python高阶函数的使用
    python内置模块collections介绍
    python中@property装饰器的使用
    三次握手四次挥手
    python类方法@classmethod与@staticmethod
  • 原文地址:https://www.cnblogs.com/patatoforsyj/p/9758403.html
Copyright © 2020-2023  润新知