c语言数据结构之重建二叉树


/**
 * 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;
}