108. 将有序数组转换为二叉搜索树
/**
* 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* travesal(vector<int>& nums, int left, int right) {
if (left > right) return nullptr;
int mid = left + (right - left) / 2;
TreeNode* root = new TreeNode(nums[mid]);
root->left = travesal(nums, left, mid - 1);
root->right = travesal(nums, mid + 1, right);
return root;
}
TreeNode* sortedArrayToBST(vector<int>& nums) {
return travesal(nums, 0, nums.size() - 1);
}
};
105. 从前序与中序遍历序列构造二叉树
/**
* 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:
unordered_map<int, int> index;
TreeNode* travesal(vector<int>& preorder, int prestart, int preend,
vector<int>& inorder, int instart, int inend) {
if (instart > inend) return nullptr;
int rootVal = preorder[prestart];
TreeNode* root = new TreeNode(rootVal);
int rootIndex = index[rootVal];
int leftLen = rootIndex - instart;
root->left = travesal(preorder, prestart + 1, prestart + leftLen, inorder, instart, rootIndex - 1);
root->right = travesal(preorder, prestart + leftLen + 1, preend, inorder, rootIndex + 1, inend);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
for (int i = 0; i < inorder.size(); ++i) {
index[inorder[i]] = i;
}
return travesal(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
};
106. 从中序与后序遍历序列构造二叉树
/**
* 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:
unordered_map<int, int> index;
TreeNode* myBuildTree(vector<int>& inorder, int instart, int inend,
vector<int>& postorder, int poststart, int postend) {
if (instart > inend) return nullptr;
int rootVal = postorder[postend];
int inIndex = index[rootVal];
int leftSize = inIndex - instart;
TreeNode* root = new TreeNode(rootVal);
root->left = myBuildTree(inorder, instart, inIndex - 1, postorder, poststart, poststart + leftSize - 1);
root->right = myBuildTree(inorder, inIndex + 1, inend, postorder, poststart + leftSize, postend - 1);
return root;
}
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
for (int i = 0; i < inorder.size(); ++i) {
index[inorder[i]] = i;
}
return myBuildTree(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
}
};
889. 根据前序和后序遍历构造二叉树
/**
* 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:
unordered_map<int, int> index;
TreeNode* myConstructFromPrePost(vector<int>& preorder, int prestart, int preend,
vector<int>& postorder, int poststart, int postend) {
if (prestart > preend) return nullptr;
if (prestart == preend) {
return new TreeNode(preorder[prestart]);
}
int rootVal = preorder[prestart];
int leftVal = preorder[prestart + 1];
int postIndex = index[leftVal];
int leftSize = postIndex - poststart + 1;
TreeNode* root = new TreeNode(rootVal);
root->left = myConstructFromPrePost(preorder, prestart + 1, prestart + leftSize, postorder, poststart, postIndex);
root->right = myConstructFromPrePost(preorder, prestart + leftSize + 1, preend, postorder, postIndex + 1, postend - 1);
return root;
}
TreeNode* constructFromPrePost(vector<int>& preorder, vector<int>& postorder) {
for (int i = 0; i < postorder.size(); ++i) {
index[postorder[i]] = i;
}
return myConstructFromPrePost(preorder, 0, preorder.size() - 1, postorder, 0, postorder.size() - 1);
}
};