学渣带你刷Leetcode0105从前序与中序遍历序列构造二叉树

题目描述

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

白话题目:
 

算法:

 

详细解释关注 B站  【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB

C语言完全代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
static struct TreeNode* helper(int* preorder, int preorderSize, int* inorder, int inorderSize,
                               int preorder_index, int inorder_start, int inorder_end)
{
    if (preorder_index > preorderSize - 1 || inorder_start > inorder_end)
    {
        return NULL;
    }

    struct TreeNode* pNode = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    pNode->val = preorder[preorder_index];
    int index = inorder_start;

    while (index <= inorder_end)
    {
        if (preorder[preorder_index] == inorder[index])
        {
            break;
        }
        index++;
    }

    pNode->left = helper(preorder, preorderSize, inorder, inorderSize,
                         preorder_index + 1, inorder_start, index - 1);
    pNode->right = helper(preorder, preorderSize, inorder, inorderSize,
                          preorder_index + (index - inorder_start + 1), index + 1, inorder_end);

    return pNode;
}

struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){
    return helper(preorder, preorderSize, inorder, inorderSize, 0, 0, inorderSize - 1);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章