从先序和中序构造二叉树

好久不见. 提交于 2019-11-30 12:28:37

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 };

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!