Leetcode938二叉搜索樹的範圍和(python實現)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章