/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
if(preorderSize==0)
return NULL;
struct TreeNode *root=(struct TreeNode*)malloc(sizeof(struct TreeNode));
root->val=preorder[0];
int i;
for(i=0;i<inorderSize;i++)
if(inorder[i]==preorder[0])
break;
root->left=buildTree(&preorder[1],i,&inorder[0],i);
root->right=buildTree(&preorder[i+1],preorderSize-i-1,&inorder[i+1],preorderSize-i-1);
return root;
}
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
,可以给我细细讲解一下嘛,越看越懵,尤其是传的参数与下边的递归那里
// 根据前序遍历序列和中序遍历序列,构建二叉树
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
// 递归结束的条件,即前序遍历序列为空
if(preorderSize==0)
return NULL;
// 分配内存空间,创建根节点
struct TreeNode root=(struct TreeNode)malloc(sizeof(struct TreeNode));
// 根节点值为前序遍历序列的第一个元素
root->val=preorder[0];
int i;
// 在中序遍历序列中寻找根节点的位置
for(i=0;i<inorderSize;i++)
if(inorder[i]==preorder[0])
break;
// 递归构建左子树,左子树的前序遍历序列为从第二个元素开始到i,
// 中序遍历序列为从第一个元素开始到i-1
root->left=buildTree(&preorder[1],i,&inorder[0],i);
// 递归构建右子树,右子树的前序遍历序列为从第i+1个元素开始到最后,
// 中序遍历序列为从i+1开始到最后一个元素
root->right=buildTree(&preorder[i+1],preorderSize-i-1,&inorder[i+1],inorderSize-i-1);
// 返回根节点指针
return root;
}