🏆个人主页:企鹅不叫的博客
🌈专栏
⭐️ 博主码云gitee链接:代码仓库地址
⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!
💎一、题目
🏆1.题目描述
🏆2.原题链接
💎二、解题报告
🏆1.思路分析
🔑思路:
首先根据前序遍历和中序遍历可以确定在前序遍历中的根是preorder[0],在中序遍历中经过循环找到和前序相等的数就是中序遍历中的根inorder[i],[0, i-1]是左子树,[i+1, inorderSize]是右子树,那么中序遍历中根前面的是左子树,右面的是右子树,那么前序遍历中[1, i]是左子树,[i+1,preorderSize]是右子树
🏆2.代码详解
/**
* 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(preorder == NULL || preorderSize == 0 || inorder == NULL || inorderSize == 0) return NULL; //1
struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode)); //2
root->val = preorder[0];
int i;
for(i = 0; i < inorderSize; ++i){ //3
if(preorder[0] == inorder[i]){
break;
}
}
root->left = buildTree(&preorder[1], i, &inorder[0], i); //4
root->right = buildTree(&preorder[i + 1], preorderSize-1-i, &inorder[i + 1], preorderSize-1-i);
return root;
}
1.判断是否为空,以及树的长度
2.创建root,将preorder[0](根)的值放到root中
3.当找到preorder[0] == inorder[i]的根时,说明左子树:pre[1] ~ pre[i], in[0] ~ on[i - 1],右子树:pre[i + 1] ~ pre[size],in[i + 1] ~ in[size]
3.将左子树和长度传送
4.将右子树和长度传送