来自[负雪明烛]
本题重点:二叉搜索树,最重要的性质:二叉搜索树的中序遍历是有序的。
本题没有直接使用有序的性质,而是使用了二叉树的定义:每个节点的所有左子树都小于当前节点;每个节点的所有右子树都大于当前节点。
加入给出的是一棵普通的二叉树,是如何求所有在[low,high]之间的节点值只和呢?我们可以使用递归对所有节点遍历一次,前序、中序、后续均可,累加所有节点值在[low,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)