【问题标题】:Convert recursive __setitem__ to iterative in python在python中将递归__setitem__转换为迭代
【发布时间】:2019-10-10 20:03:48
【问题描述】:

这里有我的二叉搜索树的 setitem 方法。我目前收到“RecursionError:超出最大递归深度”错误,所以我想将其转换为迭代方法,但我有点卡住了。有什么提示吗?

class BinarySearchTreeNode:

    def __init__(self, key, item=None, left=None, right=None):
        self.key = key
        self.item = item
        self.left = left
        self.right = right

class BinarySearchTree:

    def __init__(self):
        self.root = None

    def __setitem__(self, key, item):
        self.root = self._setitem_aux_(self.root, key, item)

    # here convert this to an iterative method
    def _setitem_aux_(self, current, key, item):
        if current is None:
            current = BinarySearchTreeNode(key, item)
        elif key < current.key:
            current.left = self._setitem_aux_(current.left, key, item)
        elif key > current.key:
            current.right = self._setitem_aux_(current.right, key, item)
        else: # key == current.key
            current.item = item
        return current

并称它为:

bst = BinarySearchTree() 
# To set an item with key = 0, item = 1
bst[0] = 1 
# To set an item with key = "abcd", item = 10
bst["abcd"] = 10

【问题讨论】:

  • 你能补充一下你如何称呼这个类吗?
  • @DeveshKumarSingh bst = BinarySearchTree() 例如:使用 key = 0 设置项目,item = 1:bst[0] = 1 使用 key = "abcd" 设置项目,item = 10 : bst[ "abcd"] = 10
  • 你需要在到达叶子节点时添加条件,即left或right是None然后返回
  • 添加到问题请不要评论
  • 既然你正在迭代并且想要去匹配的节点,那么你需要检查 then node ,也就是说你正在做然后你需要检查叶子节点,如果到达叶子节点那么要做什么这样做,所以在这种情况下检查节点,即 curren=self.node ,如果 curren.left :然后检查该节点,否则如果 current.left 没有返回当前节点,您还需要设置保持检查的变量您现在正在工作的当前节点。请参阅@valentinb 解决方案

标签: python recursion iteration binary-search-tree


【解决方案1】:

也许试试这个?

def __setitem__(self, key, item):
    if self.root is None:
        self.root = BinarySearchTreeNode(key, item)
    else:
        current = self.root
        found = False
        max_iter = 10000  # set this to the appropriate value for your use case
        iter_ = 1
        while not found and iter < max_iter:
            if current is None:
                raise IndexError("Index out of bounds")
            elif key < current.key:
                current = current.left
            elif key > current.key:
                current = current.right
            else:
                found = True
            iter_ += 1

        if found:
            self.root = current
        else:
            raise IndexError("Index too far from root")

注意:递归是一种强大但危险的模式。它还可能妨碍代码的可读性。当一段迭代的代码可以达到相同的结果时,应该避免它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-26
    • 2017-03-05
    • 2015-08-22
    • 2021-03-11
    • 1970-01-01
    相关资源
    最近更新 更多