题目描述
给出一棵树的前序遍历和中序遍历,请构造这颗二叉树 注意: 可以假设树中不存在重复的节点
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param preorder int整型vector
* @param inorder int整型vector
* @return TreeNode类
*/
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
// write code here
// 前序遍历,中左右
// 中序遍历,左中右
// 由前序,在中序中确定左右,确定了左子树长度,再分割前序序列
int p = preorder.size();
if(p == 0){
return NULL;
}
// 我使用了左闭右开
return dfs(preorder, 0, p, inorder, 0, p);
}
TreeNode* dfs(vector<int>& preorder, int Pl, int Pr, vector<int>& inorder, int Il, int Ir){
// 左==右时,结束
if(Pl >= Pr){
return NULL;
}
// 找到root
int mid;
for(int i = Il; i < Ir; i++){
if(preorder[Pl] == inorder[i]){
mid = i;
break;
}
}
int leftsize = mid - Il;
TreeNode* root = new TreeNode(preorder[Pl]);
root->left = dfs(preorder, Pl+1, Pl+leftsize+1, inorder, Il, mid);
root->right = dfs(preorder, Pl+leftsize+1, Pr, inorder, mid+1, Ir);
return root;
}
};
错因
- 把mid-Il算错了,把左子树的长度加了1,导致越界了。