[LeetCode] 105. Construct Binary Tree from Preorder and Inorder Traversal

105. Construct Binary Tree from Preorder and Inorder Traversal (通过树的前序和中序遍历重建二叉树)



1. 题目翻译

给出一个树的前序和中序遍历序列,根据这两个序列,重建一个二叉树。假设不存在值相同的结点。


2. 解题方法

根据先序和中序的概念可知,在前序遍历序列中,第一个值为根节点,在相应的中序遍历序列中,该点前的所有值为该节点的左子树上的点。

例如:

前序遍历序列:[1,2,4,7,3,5,6,8]
中序便利序列:[4,7,2,1,5,3,8,6]

可知,结点1必为根节点,结点4,7,2必为结点1左子树上的结点,5,3,8,6必为右子树上的结点。所以将原序列分割为两半,即

前序遍历:[2,4,7],[3,5,6,8]
中序遍历:[4,7,2],[5,3,6,8]

然后通过递归可以完成这道题。

3. 代码

//Runtime: 23ms
class Solution {
private:
    TreeNode* build(vector<int>& preorder,int pre_s,int pre_e, vector<int>& inorder,int in_s,int in_e){
        if(pre_s>pre_e||in_s>in_e)
            return NULL;

        TreeNode* root = new TreeNode(preorder[pre_s]);

        int count = 0;

        for(int i = in_s;i<in_e;i++){
            if(inorder[i]==root->val)
                break;
            count++;
        }


        root->left = build(preorder,pre_s+1,pre_s+count,inorder,in_s,in_s+count-1);

        root->right = build(preorder,pre_s+count+1,pre_e,inorder,in_s+count+1,in_e);

        return root;

    }

public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if(preorder.size()==0||preorder.size()!=inorder.size())
            return NULL;

        TreeNode* root = new TreeNode(preorder[0]);

        int count = 0;

        for(int i = 0;i<inorder.size();i++){
            if(inorder[i]==root->val)
                break;
            count++;
        }

        root->left = build(preorder,1,count,inorder,0,count-1);

        root->right = build(preorder,count+1,preorder.size()-1,inorder,count+1,preorder.size()-1);

        return root;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值