題目描述
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。數據結構
注:設序列初始長度爲n。語言:C++ide
二叉樹結點數據結構規定以下:code
* struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * };
本題主要採用遞歸思想,解法以下:遞歸
TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) { vector<int> pre_lchild, pre_rchild, vin_lchild, vin_rchild; int i; int size = pre.size(); if(size == 0) return NULL; TreeNode* root = new TreeNode(pre[0]); for(i = 0; vin[i] != pre[0]; ++i); pre_lchild = vector<int>(pre.begin()+1, pre.begin()+i+1); vin_lchild = vector<int>(vin.begin(), vin.begin()+i); pre_rchild = vector<int>(pre.begin()+i+1, pre.end()); vin_rchild = vector<int>(vin.begin()+i+1, vin.end()); root->left = reConstructBinaryTree(pre_lchild, vin_lchild); root->right = reConstructBinaryTree(pre_rchild, vin_rchild); return root; }
時間複雜度爲O(nlogn),空間複雜度爲O(n^2)。it