这一篇介绍一下通过前序和中序、中序和后序遍历结果恢复二叉树
LeetCode 105. 从前序与中序遍历序列构造二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return (preorder.size() == 0 || inorder.size() == 0 ||
preorder.size() != inorder.size()) ?
nullptr : build(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
TreeNode* build(vector<int>& preorder, int preL, int preR, vector<int>& inorder, int inL, int inR) {
if (preL > preR || inL > inR) {
return nullptr;
}
int mid = inL;
while (inorder.at(mid) != preorder.at(preL)) {
mid++;
}
TreeNode* root = new TreeNode(inorder.at(mid));
root->left = build(preorder, preL + 1, preL + mid - inL, inorder, inL, mid - 1);
root->right = build(preorder, preL + mid - inL + 1, preR, inorder, mid + 1, inR);
return root;
}
LeetCode 106. 从中序与后序遍历序列构造二叉树
TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
return (inorder.size() == 0 || postorder.size() == 0 ||
inorder.size() != postorder.size()) ?
nullptr : build(inorder, 0, inorder.size() - 1, postorder, 0, postorder.size() - 1);
}
TreeNode* build(vector<int>& inorder, int inL, int inR, vector<int>& postorder, int postL, int postR) {
if (inL > inR || postL > postR) {
return nullptr;
}
int mid = inL;
while (inorder.at(mid) != postorder.at(postR)) {
mid++;
}
TreeNode* root = new TreeNode(inorder.at(mid));
root->left = build(inorder, inL, mid - 1, postorder, postL, postL + mid - 1 - inL);
root->right = build(inorder, mid + 1, inR, postorder, postL + mid - inL, postR - 1);
return root;
}
如有侵权,请联系删除,如有错误或更好的解法,欢迎大家指正,谢谢