leetcode_938 二叉搜索树的范围和

91 阅读1分钟

要求

给定二叉搜索树的根结点 root,返回值位于范围 [low, high] 之间的所有结点的值的和。

示例 1:

image.png

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

示例 2:

image.png

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

核心代码

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
        
class Solution:
    def rangeSumBST(self, root: TreeNode, low: int, high: int) -> int:
        self.res = 0
        def inorder(node):
            if not node:
                return 
            inorder(node.left)
            if node.val >= low and node.val <= high:
                self.res += node.val
            inorder(node.right)
        inorder(root)
        return self.res

另一解法

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

class Solution:
    def rangeSumBST(self, root: TreeNode, low: int, high: int) -> int:
        res = 0
        if not root:
            return 0
        if low<=root.val <= high:
            res += root.val
        if root.val < high:
            res += self.rangeSumBST(root.right,low,high)
        if root.val > low:
            res += self.rangeSumBST(root.left,low,high)
        return res

image.png

解题思路:第一种解法:我们使用中序遍历的方式,当我们节点的值在[low,high]之间的时候,我们就把他记录到结果中,这样最终得到范围内的和。第二种解法:使用递归的方式,因为是二叉搜索树,根节点左侧的值比根节点小,根节点右侧的值比根节点大,所以根据我们的根节点的值排除掉一些子树的遍历,所以比第一种方式更加高效。