重温算法之最大二叉树

296 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

一.题目介绍

1.题目来源

链接:LeetCode

2.题目

给定一个不重复的整数数组nums。 最大二叉树可以用下面的算法从nums递归地构建: 创建一个根节点,其值为nums中的最大值。 递归地在最大值左边的子数组前缀上构建左子树。 递归地在最大值右边的子数组后缀上构建右子树。 返回nums构建的最大二叉树 。

image.png

二.具体实现

1.实现思路

定义l为左节点,r为右节点,找终止条件:当l>r时,说明数组中已经没元素了,自然当前返回的节点为null。 每一级递归返回的信息是什么:返回的应该是当前已经构造好了最大二叉树的root节点。 一次递归做了什么:找当前范围为[l,r]的数组中的最大值作为root节点,然后将数组划分成[l,bond-1]和[bond+1,r]两段,并分别构造成root的左右两棵子最大二叉树。

2.实现代码

1)自己的实现方式

  public TreeNode constructMaximumBinaryTree(int[] nums) {
   return maxTree(nums, 0, nums.length - 1);
    }
public TreeNode maxTree(int[] nums, int l, int r){
    if (l > r){
        return null;
    }
    //找到当前最大值的索引
    int bond = findMax(nums, l, r);
    //此时bond为根节点
    TreeNode root = new TreeNode(nums[bond]);
    root.left = maxTree(nums, l, bond - 1);
    root.right = maxTree(nums, bond + 1, r);
    return root;
}
//找最大值的索引
public int findMax(int[] nums, int l, int r){
    int max = Integer.MIN_VALUE, maxIndex = l;
    for(int i = l; i <= r; i++){
        if(max < nums[i]){
            max = nums[i];
            maxIndex = i;
        }
    }
    return maxIndex;
}

2)题友的解题思路及实现代码

使用递归法,但是比我的简洁很多,下面是具体步骤:

1.二叉树的根是数组中的最大元素。

2.左子树是通过数组中最大值左边部分构造出的最大二叉树。

3.右子树是通过数组中最大值右边部分构造出的最大二叉树。

image.png

3.运行结果

image.png

image.png

三.题后思考

二叉树的题目还是很抽象,之前记得有个动态二叉树的生成网站现在已经关闭了,试用了好几款生成二叉树的开源框架感觉不是很好,不然有动态图理解起来会更加容易一些。做算法题其实空想是没用的而且效率不高,要有图协助才能事半功倍,另外题解的技巧也需要慢慢积累的,不要急着想一天两天就能完美解题的。