【力扣刷题笔记】从前序与中序遍历序列构造二叉树

一、题目描述:

给定两个整数数组preorder和inorder,其中preorder是二叉树的先序遍历,inorder是同一棵树的中序遍历,请构造二叉树并返回其根节点。

注意以下为数据的已知属性:

  1. 1 <= preorder.length <= 3000
  2. inorder.length == preorder.length
  3. -3000<= preorder[i], inorder[i]<= 3000
  4. preorder和inorder均无重复元素
  5. inorder均出现在preorder
  6. preorder保证为二叉树的前序遍历序列
  7. inorder保证为二叉树的中序遍历序列

二、解题思路:

  1. 根据先序遍历的特点确定preorder[0]一定是树的根节点
  2. 由于序列中没有重复元素,所以可以通过查找中序遍历中根节点的位置,确定左子树和右子树的序列长度
  3. 已知左右子树的序列长度,很容易得到新的子树
  4. 二叉树中每一棵子树的属性是一样的,所以可以通过递归,重复进行上述操作

三、遇到的困难:

  1. 很久没有看过关于二叉树的知识,有点生疏,但是经过简单搜索之后回忆起来了
  2. 知道使用递归,但是不知道该如何在递归中把二叉树保存下来
  3. 知道指针定义的数组需要分配空间,但是只记得molloc函数,而且具体使用方法印象模糊
  4. 复制内存的函数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 }
复制代码
posted @   qiao101  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示