【从零开始】二叉树全攻略(03):前中后序构造二叉树

在构造二叉树中,有一类典型的题目需要拿出来单独说说,那就是从数组到二叉树的分割构造。

最典型的是使用中序和后序构造二叉树这类题目。

我们先从分割的思路开始

构造最大二叉树

leetcode 654 最大二叉树

给定一个数组,用最大值作为根节点创建一棵树,然后递归的将左边的值构建左子树,右边的值构建右子树。

这里使用的分割思想也是后面构建二叉树的关键。

我们在给定数组中找到最大值,构建根节点,然后再递归左右两边即可。

左右两边也是找最大值,构建子树的根节点,以此类推。

既然要递归,那么需要一个辅助函数用来确定边界。

TreeNode* traverse(vector<int>& nums,int low,int high)

low和high就是每次递归的边界。

TreeNode* traverse(vector<int>& nums,int low,int high){//分割
        if(low>high)
            return NULL;
        
        int index=-1;
        int maxval=INT32_MIN;
        for(int i=low;i<=high;i++){//找到最大值,获取下标
            if(maxval<nums[i]){
                maxval=nums[i];
                index=i;
            }
        }
        TreeNode* root=new TreeNode(maxval);
        root->left=traverse(nums,low,index-1);//通过下标分割
        root->right=traverse(nums,index+1,high);//通过下标分割
        return root;
    }

通过遍历构造二叉树

这类题目有三道最为经典:

前序与中序构造二叉树

中序与后序构造二叉树

前序与后序构造二叉树

掌握一道题的精髓基本就掌握了其他题目

前序与中序构造二叉树

leetcode 105 前序遍历和中序遍历构造二叉树

给定前序数组和中序数组,构造出这棵二叉树

preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]

我们知道前序遍历先遍历的是根节点,在得到根节点后,就可以根据中序遍历将数组左右拆分得到左右子树。

所以对于辅助函数来说,除了两个数组外,我们还需要四个标志来确定边界。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值