给定树的前序和中序遍历,构造二叉树。
注意:您可以假设树中不存在重复项。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty()) return nullptr;
TreeNode* root;
//inorder val , index
unordered_map<int, int> inOrderMap;
unordered_map<int, int> preOrderMap;
for (int i = 0; i < inorder.size(); i++) {
preOrderMap.insert({preorder.at(i), i});
inOrderMap.insert({inorder.at(i), i});
}
root = recursiveHelper(preorder, preOrderMap, inorder, inOrderMap, 0, inorder.size() - 1);
return root;
}
private:
TreeNode* recursiveHelper(const vector<int>& preorder,
const unordered_map<int, int>& preOrderMap,
const vector<int>& inorder,
const unordered_map<int, int>& inOrderMap, int i1, int j1) {
if (i1 > j1) return nullptr;
//minPre should be the first index in preorder where a value of inorder from i1->j1 appears
//minIN should be the index of the inorder number that first appears in preorder
int minPre = INT_MAX;
int minIn;
int corresp;
for (int i = i1; i <= j1; i++) {
corresp = preOrderMap.at( inorder.at(i) );
if (corresp < minPre) {
minPre = corresp;
minIn = i;
}
}
TreeNode* root = new TreeNode( preorder.at(minPre) );
root->left = recursiveHelper(preorder, preOrderMap, inorder, inOrderMap, i1, minIn - 1);
root->right = recursiveHelper(preorder, preOrderMap, inorder, inOrderMap, minIn + 1, j1);
return root;
}
};
for循环让我认为它是O(n)
,但与其他O(n)
算法相比,该算法以毫秒为单位所需的时间要多得多。
发布于 2020-09-24 02:12:21
在给定的代码中,不仅有for循环,还有递归,这可能会使您的代码成为O(n * log )。如果你想严格证明算法的复杂性,Master theorem会很有帮助。
https://stackoverflow.com/questions/64038549
复制相似问题