371 字
2 分钟
算法之二叉搜素树范围和
938. 二叉搜索树的范围和
给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

解法
1.递归深度优先搜索
按深度优先搜索的顺序计算范围和。记当前子树根节点为 root, 分4种情况讨论
- root节点为空,返回0
- root.val值大于high的值,根据二叉搜索树的性质知道,应该此时去找root的左子树,无需考虑右子树
- root.val值小于low的值,根据二叉搜索树的性质知道,应该此时去找root的右子树,无需考虑左子树
- root.val值必须在[low, high]范围内
最终应该返回这个节点值和左右子树值的和
var rangeSumBST = function(root, low, high) { if (!root) { return 0; } if (root.val > high) { return rangeSumBST(root.left, low, high); } if (root.val < low) { return rangeSumBST(root.right, low, high); } return root.val + rangeSumBST(root.left, low, high) + rangeSumBST(root.right, low, high);};2.迭代(广度优先)
使用广度优先搜索的方法,用一个队列 q 存储需要计算的节点。每次取出队首节点时,若节点为空则跳过该节点,否则按方法一中给出的大小关系来决定加入队列的子节点。
var rangeSumBST = function(root, low, high) { let sum = 0; const q = [root]; while (q.length) { const node = q.shift(); if (!node) { continue; } if (node.val > high) { q.push(node.left); } else if (node.val < low) { q.push(node.right); } else { sum += node.val; q.push(node.left); q.push(node.right); } } return sum;}; 算法之二叉搜素树范围和
https://nollieleo.github.io/posts/算法之二叉搜素树范围和/