题目描述
给定两个整数数组 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:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
// 在先序遍历中找到根root,数组往右收缩一位
// 在中序中根据root将数组分为两部分
// 递归
if(preorder.empty()) return nullptr;
return helper(preorder, 0, preorder.size() - 1, inorder, 0, inorder.size() - 1);
}
TreeNode* helper(vector<int> &preorder, int l1, int r1, vector<int> &inorder,int l2, int r2)
{
if(l1 > r1 || l2 > r2) return nullptr;
// 确定根节点
TreeNode *root = new TreeNode(preorder[l1]);
// 在中序中寻找分段点
int mid;
for(mid = l2; mid < r2; ++mid)
{
if(inorder[mid] == preorder[l1]) break;
}
//
root->left = helper(preorder, l1 + 1, l1 + mid - l2, inorder, l2, mid - 1);
root->right = helper(preorder, l1 + mid - l2 + 1, r1, inorder, mid + 1, r2);
return root;
}
};