【力扣刷题笔记】从前序与中序遍历序列构造二叉树
一、题目描述:
给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。
注意以下为数据的已知属性:
- 1 <= preorder.length <= 3000
- inorder.length == preorder.length
- -3000<= preorder[i], inorder[i]<= 3000
- preorder和inorder均无重复元素
- inorder均出现在preorder
- preorder保证为二叉树的前序遍历序列
- inorder保证为二叉树的中序遍历序列
二、解题思路:
- 根据先序遍历的特点确定preorder[0]一定是树的根节点
- 由于序列中没有重复元素,所以可以通过查找中序遍历中根节点的位置,确定左子树和右子树的序列长度
- 已知左右子树的序列长度,很容易得到新的子树
- 二叉树中每一棵子树的属性是一样的,所以可以通过递归,重复进行上述操作
三、遇到的困难:
- 很久没有看过关于二叉树的知识,有点生疏,但是经过简单搜索之后回忆起来了
- 知道使用递归,但是不知道该如何在递归中把二叉树保存下来
- 知道指针定义的数组需要分配空间,但是只记得molloc函数,而且具体使用方法印象模糊
- 复制内存的函数memcpy完全忘记了,看了评论区的题解才发现还有这样的方法
1 /** 2 * Definition for a binary tree node. 3 * struct TreeNode { 4 * int val; 5 * struct TreeNode *left; 6 * struct TreeNode *right; 7 * }; 8 */ 9 10 11 void Traversal(struct TreeNode** root,int* preorder, int preorderSize, int* inorder, int inorderSize){ 12 *root=(struct TreeNode*)malloc(sizeof(struct TreeNode)); 13 (*root)->left=NULL; 14 (*root)->right=NULL; 15 (*root)->val=preorder[0];
16 17 18 // 找到中序序列inorder中的根节点 19 int i=0; 20 for(int j=0;j<inorderSize;j++){ 21 if(inorder[j]==preorder[0]){ 22 break; 23 } 24 i++; 25 } 26 27 //左子树 28 int lins=i; 29 if(lins>0){ 30 int *lin=(int*)malloc(sizeof(int)*lins); 31 memcpy(lin,inorder,sizeof(int)*lins); 32 int lpres=lins; 33 int *lpre=(int*)malloc(sizeof(int)*lpres); 34 memcpy(lpre,preorder+1,sizeof(int)*lpres); 35 //进入递归 36 Traversal(&(*root)->left,lpre,lpres,lin,lins); 37 free(lin); 38 free(lpre); 39 } 40 // 右子树 41 int rins=inorderSize-lins-1; 42 if(rins>0){ 43 int *rin=(int*)malloc(sizeof(int)*rins); 44 memcpy(rin,inorder+lins+1,sizeof(int)*rins); 45 int rpres=rins; 46 int *rpre=(int*)malloc(sizeof(int)*rpres); 47 memcpy(rpre,preorder+lins+1,sizeof(int)*rpres); 48 Traversal(&(*root)->right,rpre,rpres,rin,rins); 49 free(rin); 50 free(rpre); 51 } 52 53 } 54 55 struct TreeNode* buildTree(int* preorder, int preorderSize, int* inorder, int inorderSize){ 56 struct TreeNode* head=NULL; 57 Traversal(&head,preorder, preorderSize, inorder, inorderSize); 58 return head; 59 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通