题目
从前序与中序遍历序列构造二叉树
给定两个整数数组 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 保证 为二叉树的中序遍历序列
相关标签
C++
答案
/**
-
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:
unordered_map<int,int> inorder_map;
TreeNode *buildTreeHelper(vector&preorder,vector &inorder,int start,int end,int &pre_index){
if(start > end){
return nullptr;
}
int inorder_index = inorder_map[preorder[pre_index]];
TreeNode *rootnode = new TreeNode(preorder[pre_index++]);rootnode->left = buildTreeHelper(preorder,inorder,start,inorder_index-1,pre_index);
rootnode->right = buildTreeHelper(preorder,inorder,inorder_index+1,end,pre_index);
return rootnode;
}
TreeNode *buildTree(vector
{
for(int i=0;i<inorder.size();i++){
inorder_map[inorder[i]] = i;
}
int pre_index = 0;
return buildTreeHelper(preorder,inorder,0,inorder.size()-1,pre_index);
}
};
关键:
将问题分解到单个左子树和右子树的情况,用前序遍历的方式分解树,分解为左子树和右子树,然后递归到start 》 end时此时停止为空,通过全局保存map来加速程序,不需要传很多变量