[JavaScript 刷题] 树 - 将有序数组转换为二叉搜索树, leetcode 108

Posted GoldenaArcher

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[JavaScript 刷题] 树 - 将有序数组转换为二叉搜索树, leetcode 108相关的知识,希望对你有一定的参考价值。

[javascript 刷题] 树 - 将有序数组转换为二叉搜索树, leetcode 108

github repo 地址: https://github.com/GoldenaArcher/js_leetcode,Github 的目录 大概 会更新的更勤快一些。

题目地址:108. Convert Sorted Array to Binary Search Tree

题目

如下:

Given an integer array nums where the elements are sorted in ascending order, convert it to a height-balanced binary search tree.

A height-balanced binary tree is a binary tree in which the depth of the two subtrees of every node never differs by more than one.

解题思路

其实参考一下数组以及图:

[-10,-3,0,5,9]

就会发现几个规律:

  • 数组的最左数值一定是二叉树的最左侧节点
  • 数组的最右数值一定是二叉树的最大侧节点
  • 数组的最中间数值一定是二叉树的根节点

这个解题方法就会利用第三个特性去实现:

  1. 每次过程中都找到最中间的结点,将其设置为 root

    以该图为例,第一个 root 就是 0

  2. [0, ..., mid) 的部分设置为 root 的左子树

    root 的左子树为 [-10, -3],这个部分递归地调用函数去解决

    也就是说,[-10, -3] 这部分会带入 sortedArrayToBST 函数中,进行下一步的操作,即找到中点(3),将其设为 root,左子树为 -10

    最后再调用 sortedArrayToBST 进行递归,此时只有一个值 -10

    这个时候再次调用 sortedArrayToBST 进行递归就会进入 base case:if (!nums.length) return null;。递归结束,-10 的左右子树均为 null,这时候再返回上一个 call stack,将 -10 作为 -3 的左子树,如此往复

  3. (mid, ..., nums.length) 部分设置为 root 的右子树

    root 的右子树为 [5, 9],这个部分递归地调用函数去解决

    其递归调用也是同样的道理

使用 JavaScript 解题

var sortedArrayToBST = function (nums) 
  if (!nums.length) return null;

  const mid = Math.floor(nums.length / 2);
  const root = new TreeNode(nums[mid]);

  root.left = sortedArrayToBST(nums.slice(0, mid));
  root.right = sortedArrayToBST(nums.slice(mid + 1, nums.length));

  return root;
;

以上是关于[JavaScript 刷题] 树 - 将有序数组转换为二叉搜索树, leetcode 108的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题(131)~将有序数组转换为二叉搜索树一看就会 一写就废

Leetcode刷题Python108. 将有序数组转换为二叉搜索树

LeetCode刷题108-简单-将有序数组转成平衡二叉搜索树(C语言)

LeetCode刷题108-简单-将有序数组转成平衡二叉搜索树(C语言)

LeetCode刷题笔记-数据结构-day15

LeetCode刷题笔记-数据结构-day15