1.递归,时间和空间复杂度爆炸
1 int pre_id = 0; 2 unordered_map<int, int> map; 3 TreeNode* recur(int left, int right,vector<int> preorder,vector<int> inorder) 4 { 5 if (left == right) 6 { 7 return nullptr; 8 } 9 int val = preorder[pre_id]; 10 TreeNode* root = new TreeNode(val); 11 int index = map[val]; 12 pre_id++; 13 root->left = recur(left, index,preorder,inorder); 14 root->right = recur(index + 1, right,preorder,inorder); 15 return root; 16 } 17 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { 18 int left = 0; 19 int right = inorder.size(); 20 int id = 0; 21 for (auto e : inorder) 22 { 23 map[e] = id++; 24 } 25 TreeNode* root = recur(left, right,preorder,inorder); 26 return root; 27 }
2.非递归
就是个屁算法,反正我是不懂它为什么能算出来。。
1 class Solution { 2 public: 3 TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) { 4 int pre = 0, in = 0; 5 stack<TreeNode*> use; 6 if (!preorder.size()) 7 return nullptr; 8 TreeNode* root = new TreeNode(preorder[0]); 9 TreeNode* cur = root; 10 use.push(root); 11 pre++; 12 while (pre != preorder.size()) 13 { 14 if(cur->val == inorder[in]) 15 { 16 while (!use.empty() && inorder[in] == use.top()->val) 17 { 18 cur = use.top(); 19 use.pop(); 20 in++; 21 } 22 cur->right = new TreeNode(preorder[pre]); 23 cur = cur->right; 24 use.push(cur); 25 pre++; 26 } 27 else 28 { 29 TreeNode* temp = new TreeNode(preorder[pre]); 30 cur->left = temp; 31 cur = cur->left; 32 use.push(cur); 33 pre++; 34 } 35 } 36 return root; 37 } 38 };