输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。
假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
前序遍历:[[根节点] [左子树] [右子树]]
中序遍历:[[左子树] [根节点] [右子树]]
采用递归/分治
时间复杂度O(n),空间复杂度O(N)
class Solution {
public:
//中左右、左中右
TreeNode* build(vector<int>& preorder, vector<int>& inorder,int preleft,int preright,int inleft,int inright){
TreeNode *root = new(TreeNode)(preorder[preleft]);
int pos = inleft;
while(pos<=inright&&inorder[pos]!=preorder[preleft]){
pos++;
}
int leftsize = pos-inleft,rightsize = inright-pos;
if(leftsize) root->left = build(preorder,inorder,preleft+1,preleft+leftsize,inleft,pos-1);
if(rightsize) root->right = build(preorder,inorder,preleft+leftsize+1,preright,pos+1,inright);
return root;
}
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {//pos1指向前序的根节点,pos2指向中序的根节点,pos3指向分界线。
int size = preorder.size(),preleft=0,preright=size-1,inleft=0,inright=size-1;
if(size==0) return NULL;
return build(preorder,inorder,preleft,preright,inleft,inright);
}
};
该文章介绍了一种方法,通过输入的二叉树前序和中序遍历结果,使用递归和分治策略来构建二叉树。算法首先找到根节点,然后通过遍历中序遍历序列确定左右子树的边界,接着递归地构造左右子树,保证了时间复杂度为O(n)和空间复杂度为O(N)。
129

被折叠的 条评论
为什么被折叠?



