【leetcode C语言实现】剑指 Offer 07.重建二叉树

题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
【leetcode C语言实现】剑指 Offer 07.重建二叉树_第1张图片
限制:

0 <= 节点个数 <= 5000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof

解题思路

前序遍历的第一个节点即为该二叉树的根节点,其后分别是左子树节点和右子树节点,但是前序遍历无法区分左子树和右子树的分界;中序遍历的根节点在序列中间,根节点左侧为左子树节点,后侧为右子树节点,这样结合前序遍历和中序遍历的根节点可以把原始序列分别划分为左子树和右子树序列,同样,这两段序列可以按照前面一样的方法进行节点确认,最终能重建二叉树。

代码

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

    int index = 0; 
    struct TreeNode* pnode=malloc(sizeof(struct TreeNode));    
    pnode->val = preorder[0];
    while(index < inorderSize)
    {
        if(inorder[index] == preorder[0])  break;
        else index++;
    }
    pnode->left = buildTree(preorder + 1, index, inorder, index);
    pnode->right = buildTree(preorder + 1 + index, preorderSize - index - 1, inorder + index + 1, preorderSize - index - 1);

    return pnode;
}

执行结果

【leetcode C语言实现】剑指 Offer 07.重建二叉树_第2张图片

你可能感兴趣的:(leetcode-C语言实现,数据结构与算法,C语言)