计算二叉搜索树中项目的出现次数

Posted

技术标签:

【中文标题】计算二叉搜索树中项目的出现次数【英文标题】:Counting occurrence of an item in a binary search tree 【发布时间】:2021-06-11 01:01:52 【问题描述】:

我正在研究二叉搜索树的计数方法,但不知道如何实现它。

class BinarySearchTree:

    def __init__(self, root: Optional[Any]) -> None:
        if root is None:
            self._root = None
            self._left = None
            self._right = None
        else:
            self._root = root
            self._left = BinarySearchTree(None)
            self._right = BinarySearchTree(None)

    def is_empty(self) -> bool:
        return self._root is None

    def __contains__(self, item: Any) -> bool:
        if self.is_empty():
            return False
        elif item == self._root:
            return True
        elif item < self._root:
            return item in self._left 
        else:
            return item in self._right

    def count(self, item: Any) -> int: # not sure how to finish implementing this
       if self.is_empty():
            return 0
        count = 0
        elif item == self._root: # python says this is an illegal target for variable annotation 
            count += 1

到目前为止,如果树为空,此方法将返回 0。如果根为 树就是我要找的项目。

但它不会让我将项目与根进行比较。还有,我 需要检查其余的分支(左,右),看看是否有更多的出现 物品。我可以就如何执行此操作获得一些帮助吗?

【问题讨论】:

【参考方案1】:

您的代码中有两个语法错误:

    缩进不正确:if 的缩进程度不如对应的elif

    你不能在if 块和elif 块之间有另一个语句,所以count = 0 不能出现在你现在拥有它的地方,除非你将elif 更改为普通的if

此外,您的函数旨在返回int,但只有当树为空时,它才会返回它。在另一种情况下,它将返回None

您需要应用递归来进行计数。如果一个 BST 有重复的值,那么如果你已经到达第一次出现,那么它的左子树和右子树中都有重复的值。因此,在这种情况下,您需要在两个子树中递归。

下面是它的编码方式:

def count(self, item: Any) -> int:
    if self.is_empty():
        return 0
    count: int = 0
    if item == self._root:
        count = 1
    if item <= self._root:
        count += self._left.count(item) 
    if item >= self._root:
        count += self._right.count(item)
    return count

【讨论】:

太棒了!感谢您的帮助! 很高兴听到它对您有用。不要忘记mark the answer as accepted。

以上是关于计算二叉搜索树中项目的出现次数的主要内容,如果未能解决你的问题,请参考以下文章

leetcode简单501二叉搜索树中的众数

LeetCode——恢复二叉搜索树

LeetCode——恢复二叉搜索树

501. 二叉搜索树中的众数

501-二叉搜索树中的众数

⭐算法入门⭐《二叉树 - 二叉搜索树》中等07 —— LeetCode 501. 二叉搜索树中的众数