前往 中序,后序遍历构造二叉树, 中序,前序遍历构造二叉树
TreeNode* build(vector<int>& preorder, int l1, int r1, vector<int>& inorder, int l2, int r2)
{
if (l1>r1) return nullptr;
int x=preorder[l1], i=0; // 确定当前根节点
for(i=l2;inorder[i]!=x&&i<r2;++i); // 在中序遍历序列中找到当前根节点位置(该位置可以划分出左右两个分支)
int llen=i-l2; // 左子树结点数量
int rlen=r2-i; // 右子树结点数量
TreeNode *p = new TreeNode(x); // 建立根节点
p->left = build(preorder, l1+1, l1+llen, inorder, l2, l2+llen-1); // 递归建立左子树,+1,-1是把当前根节点位置去掉
p->right= build(preorder, r1-rlen+1, r1, inorder, r2-rlen+1, r2); // 递归建立右子树,+1,+1是把当前根节点位置去掉
return p;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return build(preorder, 0, preorder.size()-1, inorder, 0, inorder.size()-1);
}