https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/
Given inorder and postorder traversal of a tree, construct the binary tree.
Note:
You may assume that duplicates do not exist in the tree.
For example, given
inorder = [9,3,15,20,7]
postorder = [9,15,7,20,3]
Return the following binary tree:
3
/ \
9 20
/ \
15 7
/**
* 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) {}
* };
*/
算法思路:
参见:https://blog.csdn.net/weixin_41876385/article/details/107138934
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n = postorder.size();
if(inorder.size() != n) return NULL;
if(n == 0) return NULL;
return myBuildTree(inorder, postorder, 0, n-1, 0, n-1);
}
private:
TreeNode* myBuildTree(vector<int>& inorder, vector<int>& postorder,
int istart, int iend, int postart, int poend){
if(postart > poend) return NULL;
if(postart == poend) return new TreeNode(postorder[poend]);
int rootValue = postorder[poend];
TreeNode* curRoot = new TreeNode(rootValue);
int count = 0;
int i;
for(i = istart; i <= iend; i++){
if(inorder[i] == rootValue) break;
count++;
}
curRoot->left = myBuildTree(inorder, postorder, istart, i - 1, postart, postart + count - 1);
curRoot->right = myBuildTree(inorder, postorder, i + 1, iend, postart + count, poend - 1);
return curRoot;
}
};
使用map改进一下,umordered_map的find操作时间O(1),map的find操作时间O(log n),但从提交情况来看使用map多数情况更快,map底层实现是红黑树,unordered_map底层实现是散列(哈希),猜测可能建立散列的时候花费时间比建立红黑树慢。又提交了几次,使用unordered_map平均更快些,难道是因为网速度
class Solution {
public:
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n = postorder.size();
if(inorder.size() != n) return NULL;
if(n == 0) return NULL;
unordered_map<int, int> um;
for(int i = 0; i < n; i++) um[inorder[i]] = i;
return myBuildTree(postorder, 0, n-1, 0, um);
}
private:
TreeNode* myBuildTree(vector<int>& postorder, int postart, int poend,
int istart, unordered_map<int, int>& um){
if(postart > poend) return NULL;
if(postart == poend) return new TreeNode(postorder[poend]);
int rootValue = postorder[poend];
TreeNode* curRoot = new TreeNode(rootValue);
int i = um[rootValue];
int count = i - istart;
curRoot->left = myBuildTree(postorder, postart, postart + count - 1, istart, um);
curRoot->right = myBuildTree(postorder, postart + count, poend - 1, i + 1, um);
return curRoot;
}
};