由先序、中序遍历求后序遍历 递归算法

问题解决

  • 突破点在先序和中序遍历能给出什么信息?根节点。
  • ACM的输出对格式要求比较严格:输出时字符与字符之间有间隔,然而最后一个字符后面并不希望出现空格符。
  • 不说多的,直接上代码:

      #include <iostream>
    
      using namespace std;
    
      void BinaryTreeFromOrderings(int *preorder, int *inorder, int length ,int pr)
      {
          if(length <= 0)
          {
               return;
          }
          int thisNode = *preorder;
          int rootIndex = 0;
          for(;rootIndex < length; rootIndex++)
          {
               if(inorder[rootIndex] == *preorder)
               break;
          }
    
          BinaryTreeFromOrderings(preorder+1, inorder, rootIndex,pr);   //左子树递归
    
          BinaryTreeFromOrderings(preorder + rootIndex + 1,inorder + rootIndex + 1,length - (rootIndex + 1),pr);  //右...
    
          cout<<thisNode;
          if (thisNode!=pr) {
              cout<<" ";         //后序遍历最后一个字符即为先序遍历第一个字符,以此作为遍历结束的标志
          }
          return;
      }
    
    
      int main(int argc, char* argv[])
      {
          int n;
          int pre[1000];
          int in[1000];
          while (cin>>n) {
              for (int i=0; i<n; i++) {
                  cin>>pre[i];
              }
              for (int i=0; i<n; i++) {
                  cin>>in[i];
              }
              BinaryTreeFromOrderings(pre,in, n,pre[0]);
              printf("\n");
          }
    
          return 0;
      }

 

posted @ 2016-03-16 22:08  早上好王木木  阅读(263)  评论(0)    收藏  举报