二叉树重建

二叉树重建是涉及到二叉树知识点中肯定会遇到的问题。前序加中序遍历,或者中序加后序遍历可以唯一地重建一棵二叉树。

如:给定前序遍历数组{1,2,4,7,3,5,6,8},中序遍历数组{4,7,2,1,5,3,8,6},然后重建一棵二叉树;

思路:在前序遍历数组中第一个数肯定是树的根root->val=1,然后根据root在中序数字的位置可以划分出左子树和右子树的中序遍历,同样又可以知道左子树和右子树的前序遍历,此时有:

左子树的前序数组pre_left={2,4,7}

左子树的中序数组vin_left={4,7,2}

右子树的前序数组pre_right={3,5,6,8}

右子树的中序数组vin_right={5,3,8,6}

这样依次递归下去,就可以得到每一个结点,代码如下:


    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        //如果是空,则返回
        if(pre.empty() || vin.empty())return NULL;
        //根据前中序列,构造左右子树的前中序列
        vector<int>pre_left;
        vector<int>pre_right;
        vector<int>vin_left;
        vector<int>vin_right;
        //确定根结点
        int value = pre[0];
        TreeNode* btree = new TreeNode(value);
        //得出左右子树前中序列的数组
        int i= 0;
        while(vin[i] != value){
            vin_left.push_back(vin[i]);
            pre_left.push_back(pre[i+1]);
            i++;
        }
        for(int j = i+1;j<vin.size();j++){
            vin_right.push_back(vin[j]);
            pre_right.push_back(pre[j]);
        }
        //依次递归下去
        btree->left=reConstructBinaryTree(pre_left,vin_left);
        btree->right=reConstructBinaryTree(pre_right,vin_right);
        
        return btree;

    }


如果是中序加后序遍历,也是一样的,可以根据后序遍历数组得出根结点的值。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值