剑指07 重建二叉树

该文章介绍了一种方法,通过输入的二叉树前序和中序遍历结果,使用递归和分治策略来构建二叉树。算法首先找到根节点,然后通过遍历中序遍历序列确定左右子树的边界,接着递归地构造左右子树,保证了时间复杂度为O(n)和空间复杂度为O(N)。
摘要由CSDN通过智能技术生成

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。

假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

前序遍历:[[根节点] [左子树] [右子树]]

中序遍历:[[左子树] [根节点] [右子树]]

采用递归/分治

时间复杂度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);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值