力扣重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
示例 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;
}