题目:
给定两个整数数组 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.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
map<int,int> m;
TreeNode* buildT(vector<int>& preorder,int preleft,int preright,vector<int>& inorder,int inleft,int inright)
{
if(preleft>preright||inleft>inright)return nullptr;
int rootval=preleft;
TreeNode* t=new TreeNode(preorder[rootval]);
int pIndex=m[preorder[rootval]];
t->left=buildT(preorder,preleft+1,preleft+pIndex-inleft,inorder,inleft,pIndex-1);
t->right=buildT(preorder,preleft+pIndex-inleft+1,preright,inorder,pIndex+1,inright);
return t;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n=preorder.size();
for(int i=0;i<n;i++)
{
m[inorder[i]]=i;
}
return buildT(preorder,0,n-1,inorder,0,n-1);
}
};