• 考试时候代码

    #include <iostream>
    #include <vector>
    using namespace std;
    const int N = 100;
    vector<int> resVector;
    int arr1[N], arr2[N], res[N];
    struct TreeNode {
       int val;
       TreeNode *left;
       TreeNode *right;
       TreeNode(int x) : val(x), left(NULL), right(NULL) {}
    };
    TreeNode* getTree(int* a1, int left1, int right1, int* a2, int left2, int right2) {
      if (left1>right1) return NULL;
      if (left1==right1) return new TreeNode(a1[left1]);
    
      int rootVal = a1[right1]; // 后序遍历,根
      int splitIndex = right2;
      while(a2[splitIndex] != rootVal) splitIndex--;
      TreeNode* tempRes = new TreeNode(rootVal); //
      tempRes->left = getTree(a1, left1, left1+(splitIndex-1-left2), a2, left2, splitIndex-1);
      tempRes->right = getTree(a1, left1+(splitIndex-1-left2)+1, right1-1, a2, splitIndex+1, right2);
      return tempRes;
    }
    void preOrder(TreeNode * node) {
      if(!node) return;
      resVector.push_back(node->val);
      preOrder(node->left);
      preOrder(node->right);
    }
    int main () {
      int n;
      cin >> n;
      for (int i=0; i<n; i++) cin >> arr1[i];
      for (int j=0; j<n; j++) cin >> arr2[j];
      int idx = 0;
      TreeNode* resRoot = getTree(arr1, 0, n-1, arr2, 0, n-1);
      preOrder(resRoot);
      for(int i=0; i<resVector.size(); i++) {
          cout << resVector[i];
          if(i!=resVector.size()-1) cout << " ";
      }
      return 0;
    }
  • 稍稍优化了一下

    #define  _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <vector>
    using namespace std;
    vector<int> resVector;
    struct TreeNode {
      TreeNode* left;
      TreeNode* right;
      int val;
      TreeNode(int _val) : val(_val),left(NULL),right(NULL){}
    };
    TreeNode* getTree(vector<int>& postArr, int left1, int right1, vector<int> midArr, int left2, int right2) {
      if (left1 > right1) return NULL;
      if (left1 == right1) return new TreeNode(postArr[left1]);
      int rootVal = postArr[right1];
      int splitIndex = right2;
      while (midArr[splitIndex] != rootVal) splitIndex--;
      TreeNode* tempRes = new TreeNode(rootVal);
      tempRes->left = getTree(postArr, left1, left1+(splitIndex-1-left2), midArr, left2, splitIndex - 1);
      tempRes->right = getTree(postArr, left1 + (splitIndex - 1 - left2) + 1, right1 - 1, midArr, splitIndex + 1, right2);
      return tempRes;
    }
    void preOrderTrav(TreeNode* node) {
      if (node == NULL) return;
      resVector.push_back(node->val);
      preOrderTrav(node->left);
      preOrderTrav(node->right);
    }
    int main() {
      int n;
      cin >> n;
      vector<int> postOrderArr(n), midOrderArr(n);
      for (int i = 0; i < n; i++) cin >> postOrderArr[i];
      for (int i = 0; i < n; i++) cin >> midOrderArr[i];
      TreeNode* res = getTree(postOrderArr, 0, n - 1, midOrderArr, 0, n - 1);
      preOrderTrav(res);
      for (int i = 0; i < n; i++) {
          cout << resVector[i];
          if (i != n - 1) cout << " ";
      }
      // system("pause");
      return 0;
    }