1.题目描述
给定二叉搜索树的根结点 root,返回 L 和 R(含)之间的所有结点的值的和。
二叉搜索树保证具有唯一的值。
示例 1:
输入:root = [10,5,15,3,7,null,18], L = 7, R = 15
输出:32
示例 2:
输入:root = [10,5,15,3,7,13,18,1,null,6], L = 6, R = 10
输出:23
提示:
树中的结点数量最多为 10000 个。
最终的答案保证小于 2^31。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/range-sum-of-bst
啊啊啊,这个题意呀。。我是真的没有看懂,有的人说,没看懂题意的都是刷题少的人。。。。
所以我来解释一下题意。
root=[......]我是第一次见这么写一个树的。。。根据leetcode树结构可视化结构,给出的这个序列是一个先序遍历。
给的提交代码python版的函数调用的root是根节点,不是一串序列。。。。。
这样就清晰了,可以用经典的二叉树递归了。由树的根节点开始左右子树递归遍历。
2.python解答
思路,当结点不为空时,递归遍历左右子树,如果结点的值大于等于L且小于等于R,就累加。
代码如下
class Solution(object):
def rangeSumBST(self, root, L, R):
"""
:type root: TreeNode
:type L: int
:type R: int
:rtype: int
"""
self.sumBST = 0
self.scanBST(root,L,R)
return self.sumBST
def scanBST(self, root, L, R):
if root:
if root.val>=L and root.val<=R:
self.sumBST += root.val
self.scanBST(root.left,L,R)
self.scanBST(root.right,L,R)
3.解答过程中遇到的问题
1.Python判断值是否为空
第一种是`if x is None`;
第二种是 `if not x:`;
第三种是`if not x is None`(这句这样理解更清晰`if not (x is None)`) 。
`if x is not None`是最好的写法,清晰,不会出现错误,以后坚持使用这种写法。
使用if not x这种写法的前提是:必须清楚x等于None, False, 空字符串"", 0, 空列表[], 空字典{}, 空元组()时对你的判断没有影响才行。
2.python与C++的引用混淆
Python不允许程序员选择采用传值还是传 引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用,就不能 直接修改原始对象——相当于通过“传值”来传递对象。(参考链接:https://www.jb51.net/article/127667.htm)