文章目录
- 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);
}
至此,本片文章就结束了,若本篇内容对您有所帮助,请三连点赞,关注,收藏支持下。
创作不易,白嫖不好,各位的支持和认可,就是我创作的最大动力,我们下篇文章见!
如果本篇博客有任何错误,请批评指教,不胜感激 !!!