剑指 Offer 07. 重建二叉树[c语言]

目录

    • 题目
    • 思路
    • 代码
    • 结果

该文章只是用于记录考研复试刷题

题目

力扣重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例 1:
剑指 Offer 07. 重建二叉树[c语言]_第1张图片
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]
示例 2:

Input: preorder = [-1], inorder = [-1]
Output: [-1]

限制:

0 <= 节点个数 <= 5000

思路

[平时刷的题(408)只问结果没写过代码,我写起来确实不会,只知道是递归,怎么写就…看见力扣评论区的递归代码才懂了]
难点在递归函数的参数,理解了参数和,根据先序和中序的特点转成二叉树就好写了。
递归参数:preorder和inorder用&inorder[i]的形式传参,再用Size确定数组的长度完成数组的分割。
先序和中序特点先序的头一个是根节点,再去中序中找到,左边是左子树,右边是右子树。

代码

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

结果

剑指 Offer 07. 重建二叉树[c语言]_第2张图片

你可能感兴趣的:(LeetCode,c语言,leetcode,开发语言)