105. 从前序与中序遍历序列构造二叉树
题目描述
给定两个整数数组 preorder
和 inorder
,其中 preorder
是二叉树的先序遍历, inorder
是同一棵树的中序遍历,请构造二叉树并返回其根节点。
题目理解
首先给定一个二叉树的先序遍历序列和中序遍历序列可以唯一的确定一棵二叉树。所以可以用递归的方式构造一棵二叉树
伪代码:
if
当前序列为空
return null
else
根据先序遍历序列找到当前的根节点并初始化TreeNode root
然后再中序遍历序列中找到根节点的位置,将中序遍历序列划分为左子树的中序和右子树的中序
根据左子树的中序遍历序列,可以确定左子树的节点数量,从而将先序遍历序列划分为左子树的先序遍历序列和右子树的先序遍历序列
root -> left = 使用左子树的先序遍历序列和中序遍历序列构造的左子树
root -> right = 使用右子树的先序遍历序列和中序遍历序列构造的右子树
return root
代码
class Solution {
unordered_map<int, int> index;
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
int n = inorder.size();
for(int i = 0; i < n; i++){
index[inorder[i]] = i;
}
return createBinaryTree(preorder, inorder, 0, n-1, 0, n-1);
}
TreeNode* createBinaryTree(const vector<int>& preorder, const vector<int>& inorder, int preorder_left, int preorder_right, int inorder_left, int inorder_right){
if(preorder_left > preorder_right)
return nullptr;
int preorder_root = preorder_left;
int inorder_root = index[preorder[preorder_root]];
int sizeLeftTree = inorder_root - inorder_left;
TreeNode* root = new TreeNode(preorder[preorder_root]);
root->left = createBinaryTree(preorder, inorder, preorder_left + 1, preorder_left+sizeLeftTree, inorder_left, inorder_root-1);
root->right = createBinaryTree(preorder, inorder, preorder_left+1+sizeLeftTree, preorder_right, inorder_root+1, inorder_right);
return root;
}
};