首页 > 编程语言 >题解 力扣 LeetCode 105 从前序与中序遍历序列构造二叉树 C/C++

题解 力扣 LeetCode 105 从前序与中序遍历序列构造二叉树 C/C++

时间:2024-09-12 19:49:13浏览次数:16  
标签:遍历 int 题解 C++ inarr arrSize 二叉树 序列 节点

题目传送门:

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)icon-default.png?t=O83Ahttps://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/

每次在中序遍历序列片段中找到前序遍历序列队首,这是该层的根节点

该位置左侧是左子树,右侧是右子树

再分别在左右子树序列中进行同样操作,找到左右子树的根节点,循环往复得到整棵树

每次找到一层的根节点就从前序遍历序列中出队它

前序遍历序列队列队首用head标记

arrSize表示该次能访问的中序遍历序列片段的长度,若 <= 0,说明该层没有节点,返回 NULL

这就是递归的终止条件

代码:

struct TreeNode* BiTree_init(int val)//节点创建&初始化
{
	struct TreeNode* p = (struct TreeNode*)malloc(sizeof(struct TreeNode));
	if (p == NULL) return NULL;
	p->val = val;
	p->left = p->right = NULL;
	return p;
}
struct TreeNode* buildTree_sub(int* prearr, int* inarr, int arrSize, int* head)
{
	if (arrSize <= 0) return NULL;
	int i;
	for (i = 0; i < arrSize && inarr[i] != prearr[*head]; i++);
	struct TreeNode* root = BiTree_init(prearr[(*head)++]);
	root->left = buildTree_sub(prearr, &inarr[0], i, head);
	root->right = buildTree_sub(prearr, &inarr[i + 1], arrSize - i - 1, head);
	return root;
}
struct TreeNode* buildTree(int* prearr, int arrSize, int* inarr, int useless)
{//多封装了一层,该次封装主要是为了在不使用全局变量和外部变量的前提下使用队列
	if (arrSize <= 0) return NULL;
	int head = 0, i;
	for (i = 0; i < arrSize && inarr[i] != prearr[head]; i++);
	struct TreeNode* root = BiTree_init(prearr[head++]);
	root->left = buildTree_sub(prearr, &inarr[0], i, &head);
	root->right = buildTree_sub(prearr, &inarr[i + 1], arrSize - i - 1, &head);
	return root;
}

拓展:

若二叉树中有相同元素,还想通过前序&中序遍历序列重构二叉树

提供的前序中序遍历结果要是存放节点地址的指针数组,而不能再是节点存放的数据

重构函数中操作的对象也要从节点数据变为节点地址

思路还是一样的,只是操作对象从数据变成地址了,就算节点数据一样,地址还都是不同的

标签:遍历,int,题解,C++,inarr,arrSize,二叉树,序列,节点
From: https://blog.csdn.net/qwq_ovo_pwp/article/details/142184292

相关文章

  • P3267 [JLOI2016/SHOI2016] 侦察守卫 题解
    P3267[JLOI2016/SHOI2016]侦察守卫题解\(n\le5\times10^5,D\le20\)的数据范围显然想到\(O(nd)\)的树形dp。考虑\(d\)这一维的状态设计。考虑\(i\)子树中的情况分为全部被覆盖和未全部被覆盖两种。对于第一种,显然我们要考虑子树中能向上覆盖影响的点的个数,于是设......
  • P11030 『DABOI Round 1』Blessings Repeated题解
    P11030『DABOIRound1』BlessingsRepeated题解【形式化题意】给定一个正整数\(k\)和两个字符串\(S,T\)。设字符串\(s\)为\(k\)个字符串\(S\)首尾相接得到的字符串,\(n=\verts\vert,m=\vertT\vert\)。设答案集合\(P=\{(i_0,i_1,\dots,i_{m-1})\mid0\lei......
  • C++面试题整理 1
    1.new和malloc什么区别?new和malloc都用于在堆上分配内存,new是c++中的关键字,分配内存后还会调用构造函数2.std中unorded_map,map,multimap有什么区别?unorderd_map中元素不按键值排序,底层数据结构是哈希表,相对map查询速度快,内存开销大map中元素按键值排序,底层数据结构是红黑......
  • cloud studio配置C++环境
    cloudstudio腾讯推出的云IDE,里面有很多现成的语言环境,这里讲一下C++的环境配置1.选择C++环境模板创建就可以了2.可以直接run或者g++编译3.安装插件第一个C++插件需要自己离线下载上传安装上去,在cloudstudio的插件商店里面搜索不到自行搜索怎么下载离线插件4task和laun......
  • 使用 Visual Studio Code 配置 C/C++ 开发环境
    VisualStudioCode(简称VSCode)是一款非常流行的代码编辑器,提供了丰富的扩展和配置支持,使其成为进行C/C++开发的一款理想工具。本文将详细介绍如何在VSCode中配置C/C++开发环境,涵盖安装必要的工具和插件、编写简单的C/C++程序、配置调试环境等内容。更多内容一、安装......
  • 掌握 C++17:结构化绑定与拷贝消除的妙用
    C++17特性示例1.结构化绑定(StructuredBinding)结构化绑定允许你用一个对象的元素或成员同时实例化多个实体。结构化绑定允许你在声明变量的同时解构一个复合类型的数据结构(如结构体,std::tuple,std::pair,或者std::array)。这样可以方便地获取多个值,而不需要显式地调用std::......
  • CTS2024 题解
    \(\text{ByDaiRuiChen007}\)D1T1.水镜ProblemLink给定\(a_1\sima_n\),求多少个\([l,r]\)满足存在实数\(L\),将若干个\(a_i\)变成\(2L-a_i\)后\(a_l\sima_r\)严格递增。数据范围:\(n\le10^6\)。考虑钦定\(i-1\)翻转/不翻转,\(i\)翻转/不翻转,容易发现......
  • C++知识点:size_t, a.at(i), reverse函数
    1.size_t`size_t`是一种在C/C++编程中非常常用的数据类型,它定义在`<stddef.h>`或者`<cstdlib>`等头文件中,通常用来表示**大小**或**长度**。###关键特性:1.**无符号类型**:`size_t`是无符号整数类型,表示它只能存储非负整数。因此,它不会用于存储负值,这使得它非常适合表示诸如......
  • 【题解】Solution Set - NOIP2024集训Day27 树形 dp
    【题解】SolutionSet-NOIP2024集训Day27树形dphttps://www.becoder.com.cn/contest/5521「HDU4661」MessagePassing「BZOJ3935」Rbtree「ARC101E」RibbonsonTree「AGC034E」CompleteCompress「COCI2014.10」Kamp「SCOI2015」小凸玩密室「AGC008F」Black......
  • C++ 指针
    声明int*ipl,*ip2;//ipl和ip2都是指向int型对象的指针doubledp,*dp2;//dp2是指向double型对象的指针,dp是double型对象因为引用不是对象,没有实际地址,所以不能定义指向引用的指针。指针值指针的值(即地址)应属下列4种状态之一:指向一个对象。指向紧邻对象所占空......