chatgpt-带你学习算法系列之最大二叉树

41 阅读2分钟

如何向AI学习拆解题目

  1. 最大二叉树 leetcode.cn/problems/ma…

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:

  1. 创建一个根节点,其值为 nums 中的最大值。
  2. 递归地在最大值 左边 的 子数组前缀上 构建左子树。
  3. 递归地在最大值 右边 的 子数组后缀上 构建右子树。

返回 nums 构建的 最大二叉树

chatgpt回答

接下来,让我们一步一步拆解这些步骤:

Step 1:找到数组 nums 中的最大值 找到数组中的最大值,这个值将成为当前根节点的值。可以通过遍历数组来找到最大值,也可以使用一些语言提供的内置函数,如 max()

Step 2:将数组 nums 分成两部分 根据找到的最大值的索引,将数组 nums 分成两部分:左边是根节点左子树的元素,右边是根节点右子树的元素。

Step 3:递归构建左子树 递归地调用构建最大二叉树的函数,传入左子树部分的数组,将返回的树作为当前根节点的左子树。

Step 4:递归构建右子树 递归地调用构建最大二叉树的函数,传入右子树部分的数组,将返回的树作为当前根节点的右子树。

Step 5:返回当前根节点 构建完左子树和右子树后,返回当前根节点。

无论是简单还是复杂的题目都按照步骤一步步来拆解

首先找最大值,这里原本可能要用循环,但是ES6有一个语法糖可以直接使用

   maxValue= Math.max(...nums);

第二步构建

根节点

第三步

递归处理左侧数组与右侧数组

这里注意一些,凡是涉及重复,递归的问题, 不要想的太深,逻辑完全一致的只考虑一层就好.

    root.left = findMaxBinaryTree(nums.slice(0, maxIndex))
    root.right = findMaxBinaryTree(nums.slice(maxIndex + 1))

最后完整答案

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var constructMaximumBinaryTree = function(nums) {
  let maxValue;
  let findMaxBinaryTree = (nums, maxIndex) => {
    if(nums.length === 0) return null
    maxValue= Math.max(...nums);
    maxIndex = nums.indexOf(Math.max(...nums));
    let root = new TreeNode(maxValue);
    root.left = findMaxBinaryTree(nums.slice(0, maxIndex))
    root.right = findMaxBinaryTree(nums.slice(maxIndex + 1))
    return root

  }
   return  findMaxBinaryTree(nums, 0)

};

在这个过程中我没有看任何答案和参考,也很少做题,但是更加gpt的一步步拆解,一步步分析,答案很快就出来了,而且我对比了一些其他题解,这一版答案非常精练,易懂。

所以ai时代要学会利用工具来壮大自己