leetcode刷题 654最大二叉树

给定一个不含重复元素的整数数组 nums 。一个以此数组直接递归构建的 最大二叉树 定义如下:

    二叉树的根是数组 nums 中的最大元素。
    左子树是通过数组中 最大值左边部分 递归构造出的最大二叉树。
    右子树是通过数组中 最大值右边部分 递归构造出的最大二叉树。

返回有给定数组 nums 构建的 最大二叉树 。

思路:

        本题其实主要就是两个步骤:

        1:找到数组nums的最大元素的下标maxPosition

        2:创建根节点root

        在创建出一个根节点root后,maxPosition把nums分成了两个子数组。之后只需要:

        一.将root的右子节点作为一个新的根节点,maxPosition右边部分的子数组作为一个新的数组,重复1、2即可

        二.将root的左子节点作为一个新的根节点,maxPosition左边部分的子数组作为一个新的数组,重复1、2即可

        然后不断重复以上步骤,直到数组被不断分割到没法再分割就停止

代码如下:

   public TreeNode constructMaximumBinaryTree(int[] nums) {
        int max=getMax(nums,0,nums.length-1);//获得某个字符子串的最大值的下标
        TreeNode root=new TreeNode(nums[max]);
        creatMaxTree(root,nums,max+1,nums.length-1,"r");
        creatMaxTree(root,nums,0,max-1,"l");
        return root;
    }


    private void creatMaxTree(TreeNode root, int[] nums, int begin, int end, String kid) {
        int maxPosition=getMax(nums,begin,end);
        if(maxPosition==-1) {
            return;
        }
        if(kid.equals("r")){
            root.right=new TreeNode(nums[maxPosition]);
            creatMaxTree(root.right,nums,maxPosition+1,end, "r");
            creatMaxTree(root.right,nums,begin,maxPosition-1, "l");
        }else {
            root.left=new TreeNode(nums[maxPosition]);
            creatMaxTree(root.left,nums,maxPosition+1,end, "r");
            creatMaxTree(root.left,nums,begin,maxPosition-1, "l");
        }

    }

    private int getMax(int[] nums, int begin, int end) {
        if(begin>end) return -1;
        int key=begin;
        for (int i = begin+1; i <=end ; i++) {
            if(nums[key]<nums[i]) key=i;
        }
        return key;
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值