重建二叉树
1.题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
2.思路
二叉树前序遍历序列第一个节点是根节点,中序遍历根节点左边的是左子树,右边是右子树。
3.代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if(preorder.empty()){
return NULL;
}
return _buildTree(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
}
TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int pre_left, int pre_right, int in_left, int in_right){
if(pre_left > pre_right || in_left > in_right){
return NULL;
}
TreeNode* root = new TreeNode(preorder[pre_left]);
int rootIdx = in_left;
for(; rootIdx < pre_right;++rootIdx){
if(inorder[rootIdx] == root->val){
break;
}
}
int diff = rootIdx - in_left;
root->left = _buildTree(preorder, inorder, pre_left+1, pre_left+diff, in_left, rootIdx-1);
root->right = _buildTree(preorder, inorder, pre_left+diff+1, pre_right, rootIdx+1, in_right);
return root;
}
};
4.复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)