TOP101题解 | BM40#重建二叉树#

重建二叉树

https://www.nowcoder.com/practice/8a19cbe657394eeaac2f6ea9b0f6fcf6

/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 * };
 */
/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 * @author Senky
 * @date 2023.08.20
 * @par url https://www.nowcoder.com/creation/manager/content/584337070?type=column&status=-1
 * @brief 通过给定前序遍历和中序遍历的结果来重建二叉树
 *  重建二叉树的基本思路是利用递归,首先从前序遍历序列中找到根节点,然后根据根节点在中序遍历序列中的位置
 *  划分出左子树和右子树的中序遍历序列
 *  接着递归构建左子树和右子树。
 * @param preOrder int整型一维数组 
 * @param preOrderLen int preOrder数组长度
 * @param vinOrder int整型一维数组 
 * @param vinOrderLen int vinOrder数组长度
 * @return TreeNode类
 */

struct TreeNode* buildTree(int* preOrder, int preStart, int preEnd, int* vinOrder, int vinStart, int vinEnd) {
    if(preStart > preEnd || vinStart > vinEnd)
    {
        return NULL;
    }
    
    // 根节点的值为前序遍历的第一个元素
    int rootVal = preOrder[preStart];
    struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    root->val = rootVal;
    root->left = root->right = NULL;
    
    // 在中序遍历数组中找到根节点的位置
    int rootIdx = vinStart;
    while(rootIdx <= vinEnd)
    {
        if(rootVal == vinOrder[rootIdx])
        {
            break;
        }
        rootIdx++;
    }
 
    
    // 左右子树的节点数
    int leftLen = rootIdx - vinStart;
    int rightLen = vinEnd - rootIdx;
    
    /* 递归构建左子树和右子树:
        左子树的前序和中序
        右子树的前序和中序
    */
    root->left = buildTree(preOrder, preStart + 1, preStart + leftLen,  vinOrder, vinStart,  rootIdx - 1);
    root->right = buildTree(preOrder, preStart + leftLen + 1, preEnd, vinOrder,  rootIdx + 1, vinEnd);
    
    return root;
}

struct TreeNode* reConstructBinaryTree(int* preOrder, int preOrderLen, int* vinOrder, int vinOrderLen) {
    /*每一个值都必须是合法值*/
    if(NULL == preOrder || NULL == vinOrder || preOrderLen != vinOrderLen || preOrderLen < 0)
    {
        return NULL;
    }
    
    return buildTree(preOrder, 0, preOrderLen - 1, vinOrder, 0, vinOrderLen - 1);
}

#TOP101#
TOP101-BM系列 文章被收录于专栏

系列的题解

全部评论

相关推荐

头像
05-24 12:47
已编辑
莆田学院 Java
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务