【剑指offer】07. 重建二叉树

这篇博客讨论了如何利用前序遍历和中序遍历的结果来递归地构建二叉树。通过分析前序遍历确定根节点,然后在中序遍历中找到根节点位置,以此划分左右子树并进行递归构建。具体实现中,定义了一个名为`build`的辅助函数,根据给定的两个遍历序列的边界进行操作。
摘要由CSDN通过智能技术生成

1.题目

 2.解题思路

用递归的思想解决问题:

 首先,前序遍历是“根左右”,而中序遍历是“左根右”, 所以由前序遍历能确定根节点,然后在中序遍历中找到该节点的位置,由该节点可划分左右子树,我们可以发现,数字1是根节点,并将二叉树分成了(247)和(3568)两棵子树。并且可以判断出左右字数的长度,由此构建左右子树;

假设,preStart为前序遍历的起始位置,int num = preorder[preStart]为根节点的值,所以就可以构建TreeNode* root = new TreeNode(num)的一个新的二叉树,再找出根节点在中序遍历中的位置,即index,int leftSize = index - inStart为左子树的长度,然后构建二叉树的左右子树,不断递归;

class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {

        return build(preorder, inorder, 0, preorder.size() - 1, 0, inorder.size() - 1);
    }

    TreeNode* build(vector<int>& preorder, vector<int>& inorder, int preStart , int preEnd,    int inStart, int inEnd)
    {

        if(preStart > preEnd) 
            return nullptr;
        int num = preorder[preStart];
        TreeNode* root = new TreeNode(num);
        int index = 0;
        for(int i = inStart; i <= inEnd; i++)
        {
            if(inorder[i] == num)
            {
                index = i;
                break;
            }
        }
        int leftSize = index - inStart;
        
        root->left = build(preorder, inorder, preStart + 1, preStart + leftSize, inStart, index - 1);
        root->right = build(preorder, inorder, preStart + leftSize + 1, preEnd, index + 1, inEnd);

        return root;
    }

};

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值