题意理解
给出先序和中序序列,构造二叉树。
问题分析
其他
链接
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
return helper(preorder, 0, inorder, 0, inorder.size() - 1); //先序序列,先序起点,中序序列,中序起点,中序终点
}
TreeNode* helper(vector<int>& preorder, int pstart, vector<int>& inorder, int istart, int iend)
{
if (istart > iend) //中序起点大于终点
return NULL; //递归终止
int val = preorder[pstart]; //取出先序第一个值
TreeNode* root = new TreeNode(preorder[pstart]); //构造根节点
int i = 0; //查找左右子树分隔点
for (i = istart; i != iend; i ++)
{
if (val == inorder[i]) //找到了就结束查找
{
break;
}
}
root -> left = helper(preorder, pstart + 1, inorder, istart, i - 1);//构造左子树,指定中序序列起终点
root -> right = helper(preorder, pstart + (i - istart + 1), inorder, i + 1, iend);//构造右子树,指定先序起点(利用中序序列root的位置),中序序列起终点
return root;
}