NC12 重建二叉树

题目描述:给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。

示例:例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。

解题思路:在解决这题之前,我们需要知道如何从前序遍历序列和中序遍历序列中重见二叉树。

简要步骤如下:

1.前序遍历的首个元素{1,2,4,7,3,5,6,8}作为二叉树的根节点。

2.在中序序列中找到第一次这个元素出现的地方{4,7,2,1,5,3,8,6}。

3.将中序遍历序列分割为左右两份,左边的{4,7,2}在根节点的左边,右边的{5,3,8,6}在根节点的右边。

4.分割后,左子树的前序为{2,4,7},中序为{4,7,2},右子树前序为{3,5,6,8},中序为{5,3,8,6}。

5.采用递归实现,依次重复上述步骤即可实现。

    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        //求取数组长度
        if(pre.size()<1)
            return nullptr;
        int aSize = pre.size();
        //找出pre第一个数字在vin中的位置
        int preFirstpos;
        for(int i=0;i<aSize;i++)
        {
            if(vin[i] == pre[0])
            {
                preFirstpos = i;
                break;
            }
        }
        //将前序遍历序列和中序遍历序列中的左子树分割
        TreeNode *head = new TreeNode(pre[0]);
        vector<int> pre1(pre.begin()+1,pre.begin()+preFirstpos+1);
        vector<int> vin1(vin.begin(),vin.begin()+preFirstpos);
        head->left = reConstructBinaryTree(pre1,vin1);
        //将前序遍历序列和中序遍历序列中的右子树分割
        vector<int> pre2(pre.begin()+preFirstpos+1,pre.end());
        vector<int> vin2(vin.begin()+preFirstpos+1,vin.end());
        head->right = reConstructBinaryTree(pre2, vin2);
        return head;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值