给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]
示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]
提示:
1 <= preorder.length <= 3000
inorder.length == preorder.length
-3000 <= preorder[i], inorder[i] <= 3000
preorder 和 inorder 均 无重复 元素
inorder 均出现在 preorder
preorder 保证 为二叉树的前序遍历序列
inorder 保证 为二叉树的中序遍历序列
首先,二叉树的实现是:
// Definition for a binary tree node
class TreeNode
{
public:
int val;
TreeNode *left;
TreeNode *right;
TreeNode()
{
this->val=0;
this->left=nullptr;
this->right=nullptr;
}
TreeNode(int x)
{
this->val=x;
this->left=nullptr;
this->right=nullptr;
}
TreeNode(int x,TreeNode *left,TreeNode *right)
{
this->val=x;
this->left=left;
this->right=right;
}
};
Method:
因此按照以上的规则进行递归即可。
Code 0:
class Solution{
public:
// 递归构造二叉树
TreeNode *sub_buildTree(vector &preorder,int start_pre,int end_pre,vector &inorder,int start_in,int end_in){
// 如果前序遍历开始指针在前序遍历结束指针之后
if(start_pre>end_pre){
// 返回null
// 即为到达了叶节点
return nullptr;
}
// 创建一个新节点
TreeNode *root=new TreeNode(preorder[start_pre]);
// 记录先序遍历的第一个节点再中序遍历数组中的位置
int root_index=start_in;
// 遍历中序遍历数组
for(;root_index<=end_in;root_index++){
// 寻找根节点的位置
if(inorder[root_index]==root->val){
// 找到后即结束遍历
break;
}
}
// 递归遍历左子树
root->left= sub_buildTree(preorder,start_pre+1,start_pre+root_index-start_in,inorder,start_in,root_index-1);
// 递归遍历右子树
root->right= sub_buildTree(preorder,start_pre+root_index-start_in+1,end_pre,inorder,root_index+1,end_in);
// 返回该节点
return root;
}
// 从前序与中序遍历序列构造二叉树
TreeNode *buildTree(vector &preorder,vector &inorder){
// 记录二叉树的节点个数
int n=preorder.size();
// 递归构造二叉树
return sub_buildTree(preorder,0,n-1,inorder,0,n-1);
}
};
Code 1:
class Solution{
public:
unordered_map indexMap;
// 递归构造二叉树
TreeNode *sub_buildTree(vector &preorder,int start_pre,int end_pre,vector &inorder,int start_in,int end_in){
// 如果前序遍历开始指针在前序遍历结束指针之后
if(start_pre>end_pre){
// 返回null
// 即为到达了叶节点
return nullptr;
}
// 创建一个新节点
TreeNode *root=new TreeNode(preorder[start_pre]);
// 记录先序遍历的第一个节点在中序遍历数组中的位置
int root_index=indexMap[preorder[start_pre]];
// 递归遍历左子树
root->left= sub_buildTree(preorder,start_pre+1,start_pre+root_index-start_in,inorder,start_in,root_index-1);
// 递归遍历右子树
root->right= sub_buildTree(preorder,start_pre+root_index-start_in+1,end_pre,inorder,root_index+1,end_in);
// 返回该节点
return root;
}
// 从前序与中序遍历序列构造二叉树
TreeNode *buildTree(vector &preorder,vector &inorder){
// 记录二叉树的节点个数
int n=preorder.size();
// 利用unordered map记录中序遍历中每一个节点的index
for(int i=0;i
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal