您的位置:首页 > 科技 > 能源 > 根据一棵树的前序遍历与中序遍历构造二叉树(C++)

根据一棵树的前序遍历与中序遍历构造二叉树(C++)

2024/11/15 15:07:01 来源:https://blog.csdn.net/m0_50655389/article/details/139268064  浏览:    关键词:根据一棵树的前序遍历与中序遍历构造二叉树(C++)

文章目录

  • 1. 题目描述
  • 2. 题目解析

题目来源: 力扣…根据一棵树的前序遍历与中序遍历构造二叉树

1. 题目描述

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例:
在这里插入图片描述

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

提示:

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

2. 题目解析

我们知道,前序遍历提供了节点的根节点顺序,而中序遍历提供了节点在树中的相对位置。通过结合这两个遍历序列,我们可以唯一确定一棵二叉树。因此,解这道题目的核心思想是:前序遍历确定根,中序遍历根据前序遍历确定的根划分左右子树!!!

画个图理解一下:
在这里插入图片描述
代码如下:

TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int& rooti, int left, int right)
{//中序区间不存在if (left > right) return nullptr;int i = 0;//在中序区间找当前根,划分左右子树while (preorder[rooti] != inorder[i]) i++;TreeNode* root = new TreeNode(preorder[rooti++]);//递归构建左右子树// [left, i - 1] i [i + 1 right]root->left = _buildTree(preorder, inorder, rooti, left, i - 1);root->right = _buildTree(preorder, inorder, rooti, i + 1, right);return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
{int i = 0;//当前树的根的位置return _buildTree(preorder, inorder, i, 0, inorder.size() - 1);
}

至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。

创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!

如果本篇博客有任何错误,请批评指教,不胜感激 !!!
在这里插入图片描述

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com