算法第九天-二叉搜索树的范围和

二叉搜索树的范围和

题目要求

解题思路

来自[负雪明烛]
本题重点:二叉搜索树,最重要的性质:二叉搜索树的中序遍历是有序的。
本题没有直接使用有序的性质,而是使用了二叉树的定义:每个节点的所有左子树都小于当前节点;每个节点的所有右子树都大于当前节点。

直接递归

加入给出的是一棵普通的二叉树,是如何求所有在[low,high]之间的节点值只和呢?我们可以使用递归对所有节点遍历一次,前序、中序、后续均可,累加所有节点值在[low,high]之间的节点值。
要写出递归,最基本的就是要清晰地理解并记住递归函数的定义
我们为什么要用递归?是因为我们发现可以把大问题拆分成小问题,小问题恰好符合现有函数的定义,所以就用来这个函数。由于这个函数是本身,所以我们将其称为递归,在递归函数的时候,把它当作普通函数用,当作黑盒子用,只要知道了函数的含义、输入和输出就行了。不要去想这个函数内部做了什么事情。

剪枝

上面的方法中,是直接使用普通二叉树来进行计算的,其实题目给出的是二叉搜索树,所以可以根据其性质进行剪枝。

  • 二叉搜索树的左子树一定比root小,因此如果root.val<= low,那么不用继续搜索左子树;
  • 二叉搜索树的右子树一定比root大,因此如果root.val>=high,那么不用继续搜索右子树。
    经过剪枝的递归,能减少搜索的空间。因此在树特别庞大的时候,速度更快。

代码

# Definition for a binary tree node.
# 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:
        return self.dfs(root,high,low)
    def dfs(self,Tree,h,l):
        if not Tree: return 0
        elif Tree.val < l:
            return self.dfs(Tree.right,h,l)
        elif Tree.val > h:
            return self.dfs(Tree.left,h,l)
        else:
            return Tree.val + self.dfs(Tree.right,h,l) + self.dfs(Tree.left,h,l)

复杂度分析

时间复杂度: O ( N ) O(N) O(N)
空间复杂度: O ( N ) O(N) O(N)

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-08 00:30:01       75 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-08 00:30:01       80 阅读
  3. 在Django里面运行非项目文件

    2024-01-08 00:30:01       64 阅读
  4. Python语言-面向对象

    2024-01-08 00:30:01       75 阅读

热门阅读

  1. 【.NET Core】异步编程模式

    2024-01-08 00:30:01       46 阅读
  2. React Hooks之useState、useRef

    2024-01-08 00:30:01       50 阅读
  3. Kafka 基本概念和术语

    2024-01-08 00:30:01       57 阅读
  4. Python 变量与命名规则

    2024-01-08 00:30:01       52 阅读
  5. 浮点数精度问题

    2024-01-08 00:30:01       57 阅读
  6. 机器学习的算法简单介绍-朴素贝叶斯算法

    2024-01-08 00:30:01       51 阅读
  7. 华为HCIA课堂笔记第七章 以太网交换基础

    2024-01-08 00:30:01       42 阅读
  8. 尚硅谷Vue项目实战硅谷甄选笔记——2024.01.02

    2024-01-08 00:30:01       48 阅读