返回

LeetCode 938. 二叉搜索树的范围和:高阶技巧轻松掌握

前端

LeetCode 938题概述

问题

给你一棵二叉搜索树的根节点root和两个整数low和high。你需要返回树中所有值的和,值在low和high之间(包括low和high)。

示例 1:

输入:root = [10,5,15,3,7,null,18], low = 7, high = 15
输出:32

示例 2:

输入:root = [10,5,15,3,7,13,18,1,null,6], low = 6, high = 10
输出:23

提示:

  • 树中节点的数目在[1, 2 * 10^4]范围内。
  • 1 <= Node.val <= 10^5
  • 1 <= low <= high <= 10^5

解决思路

对于这道题目,我们可以使用中序遍历二叉搜索树,并将每个节点的值与low和high进行比较。如果节点的值在[low, high]之间,则将其计入总和中。

中序遍历二叉搜索树的算法如下:

function inorderTraversal(root, low, high, sum) {
  if (root == null) {
    return sum;
  }

  sum = inorderTraversal(root.left, low, high, sum);

  if (root.val >= low && root.val <= high) {
    sum += root.val;
  }

  sum = inorderTraversal(root.right, low, high, sum);

  return sum;
}

这个算法的时间复杂度为O(n),其中n是二叉搜索树中的节点数。

详细注释

/*
* @param {TreeNode} root 二叉搜索树的根节点
* @param {number} low 范围的最小值
* @param {number} high 范围的最大值
* @return {number} 二叉搜索树中所有值在[low, high]范围内的和
*/
const rangeSumBST = (root, low, high) => {
  // 创建一个变量sum来存储结果
  let sum = 0;

  // 调用中序遍历算法来遍历二叉搜索树
  sum = inorderTraversal(root, low, high, sum);

  // 返回sum
  return sum;
};

/*
* @param {TreeNode} root 二叉搜索树的根节点
* @param {number} low 范围的最小值
* @param {number} high 范围的最大值
* @param {number} sum 当前的和
* @return {number} 二叉搜索树中所有值在[low, high]范围内的和
*/
const inorderTraversal = (root, low, high, sum) => {
  // 如果根节点为空,则返回sum
  if (root == null) {
    return sum;
  }

  // 递归遍历左子树
  sum = inorderTraversal(root.left, low, high, sum);

  // 如果根节点的值在[low, high]范围内,则将根节点的值添加到sumif (root.val >= low && root.val <= high) {
    sum += root.val;
  }

  // 递归遍历右子树
  sum = inorderTraversal(root.right, low, high, sum);

  // 返回sum
  return sum;
};

代码示例

// 示例1
const root1 = {
  val: 10,
  left: {
    val: 5,
    left: {
      val: 3,
      left: null,
      right: null
    },
    right: {
      val: 7,
      left: null,
      right: null
    }
  },
  right: {
    val: 15,
    left: null,
    right: {
      val: 18,
      left: null,
      right: null
    }
  }
};

const low1 = 7;
const high1 = 15;

console.log(rangeSumBST(root1, low1, high1)); // 输出:32

// 示例2
const root2 = {
  val: 10,
  left: {
    val: 5,
    left: {
      val: 1,
      left: null,
      right: null
    },
    right: {
      val: 6,
      left: null,
      right: null
    }
  },
  right: {
    val: 15,
    left: {
      val: 13,
      left: null,
      right: null
    },
    right: {
      val: 18,
      left: null,
      right: null
    }
  }
};

const low2 = 6;
const high2 = 10;

console.log(rangeSumBST(root2, low2, high2)); // 输出:23