【剑指Offer】07. 重建二叉树

https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
   
    if(preorderSize==0) {
        return NULL;  //空数组返回空指针,表示空树
    }
    
    int all,num=preorderSize;// 标记 先序数组 第一个元素 在 中序数组 中的位置
    
    struct TreeNode* node=malloc(sizeof(struct TreeNode)); //定义根节点
    
    node->val=preorder[0]; //前序数组的第一个元素,是根节点的值
    
    
    while(num--) {  //匹配 preorder[0] 在 inorder 的下标
        if(inorder[num]==preorder[0]){ // num是前序数组的数组长度,如果中序数组中有数和根节点的值相同,跳出
            break;
        }
    } 
    all=num+1; //all 为 num+1 的位置

    //递归
    node->left=buildTree(preorder+1,num,inorder,num); 

    // [1],[2,4,7],[3,5,6,8]
    // [4,7,2],[1],[5,3,8,6]

    /*
    构建左子树:  
        preorder+1:前序数组([2,4,7])从2开始
        num: 左子树的范围(4,7,2)
        inorder: 中序遍历数组
        num:  右子树的范围
    */
    
    node->right=buildTree(preorder+all,preorderSize-all,inorder+all,inorderSize-all);
    /*
    构建右子树:
        preorder+all:前序数组([3,5,8,6])从3开始
        num: 左子树的范围
        inorder: 中序遍历数组
        num:  右子树的范围
    */
    
    return node;
}

你可能感兴趣的:(【剑指Offer】07. 重建二叉树)