树结构
1.已知前序与中序遍历序列构造二叉树
class Solution {
private:
unordered_map<int, int> index;
public:
TreeNode* myBuildTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right) {
if (preorder_left > preorder_right) {
return nullptr;
}
int preorder_root = preorder_left;
int inorder_root = index[preorder[preorder_root]];
TreeNode* root = new TreeNode(preorder[preorder_root]);
int size_left_subtree = inorder_root - inorder_left;
root->left = myBuildTree(preorder, inorder, preorder_left + 1, preorder_left + size_left_subtree, inorder_left, inorder_root - 1);
root->right = myBuildTree(preorder, inorder, preorder_left + size_left_subtree + 1, preorder_right, inorder_root + 1, inorder_right);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = preorder.size();
for (int i = 0; i < n; ++i) {
index[inorder[i]] = i;
}
return myBuildTree(preorder, inorder, 0, n - 1, 0, n - 1);
}
};
2.已知中序与后序遍历序列构造二叉树
class Solution {
private:
unordered_map<int, int> index;
public:
TreeNode* create(vector<int>& inorder, vector<int>& postorder,int inorder_left, int inorder_right, int postorder_left, int postorder_right){
if(inorder_left > inorder_right){
return nullptr;
}
int root = postorder_right;
int inorder_root = index[postorder[root]];
int left_size = inorder_root - inorder_left;
TreeNode* tree = new TreeNode(postorder[postorder_right]);
tree->left = create(inorder, postorder, inorder_left, inorder_root-1, postorder_left, postorder_left+left_size-1);
tree->right = create(inorder, postorder, inorder_root + 1, inorder_right, postorder_left + left_size, postorder_right-1);
return tree;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
int n = inorder.size();
for(int i =0;i<n;i++){
index[inorder[i]] = i;
}
return create(inorder, postorder, 0 , n-1, 0 ,n-1);
}
};
leetcode:105. 从前序与中序遍历序列构造二叉树
leetcode:106. 从中序与后序遍历序列构造二叉树