python - 大列表的最大递归

标签 python recursion iteration

我正在制作一个二叉树,其中包含一个非常大的列表,几乎有 10000 个对象。问题是由于尺寸巨大,我得到了最大递归错误。它特别发生在二叉树类中,其中调用 TreeNode 来创建新对象。我不确定如何在没有递归的情况下实现这一点,因为这似乎是实现代码的最简单方法。

class TreeNode:
def __init__(self,key,val,left=None,right=None,parent=None):
    self.key = key
    self.payload = val
    self.leftChild = left
    self.rightChild = right
    self.parent = parent

def hasLeftChild(self):
    return self.leftChild

def hasRightChild(self):
    return self.rightChild

def isLeftChild(self):
    return self.parent and self.parent.leftChild == self

def isRightChild(self):
    return self.parent and self.parent.rightChild == self

def isRoot(self):
    return not self.parent

def isLeaf(self):
    return not (self.rightChild or self.leftChild)

def hasAnyChildren(self):
    return self.rightChild or self.leftChild

def hasBothChildren(self):
    return self.rightChild and self.leftChild

二叉树:

class BinarySearchTree:

def __init__(self):
    self.root = None
    self.size = 0

def length(self):
    return self.size

def __len__(self):
    return self.size

def put(self,key,val):
    if self.root:
        self._put(key,val,self.root)
    else:
        self.root = TreeNode(key,val)
    self.size = self.size + 1

def _put(self,key,val,currentNode):
    if key < currentNode.key:
        if currentNode.hasLeftChild():
               self._put(key,val,currentNode.leftChild)
        else:
               currentNode.leftChild = TreeNode(key,val,parent=currentNode)
    else:
        if currentNode.hasRightChild():
               self._put(key,val,currentNode.rightChild)
        else:
               currentNode.rightChild = TreeNode(key,val,parent=currentNode)

def __setitem__(self,k,v):
   self.put(k,v)

def get(self,key):
   if self.root:
       res = self._get(key,self.root)
       if res:
              return res.payload
       else:
              return None
   else:
       return None

def _get(self,key,currentNode):
   if not currentNode:
       return None
   elif currentNode.key == key:
       return currentNode
   elif key < currentNode.key:
       return self._get(key,currentNode.leftChild)
   else:
       return self._get(key,currentNode.rightChild)

def __getitem__(self,key):
   return self.get(key)

def __contains__(self,key):
   if self._get(key,self.root):
       return True
   else:
       return False

最佳答案

将递归方法转换为迭代方法相当简单,例如:

def get(self, key):
   node = self.root
   while node:
      if node.key == key:
         return node.payload
      elif key < node.key:
         node = node.leftChild
      else:
         node = node.rightChild
   return None

def put(self, key, val):
    if not self.root:
        self.root = TreeNode(key, val)
    else:
        self._put(key, val, self.root)
    self.size = self.size + 1

def _put(self, key, val, currentNode):
    while True:
        if key < currentNode.key:
            if currentNode.hasLeftChild():
                currentNode = currentNode.leftChild
            else:
                currentNode.leftChild = TreeNode(key, val, parent=currentNode)
                break
        else:
            if currentNode.hasRightChild():
                currentNode = currentNode.rightChild
            else:
                currentNode.rightChild = TreeNode(key, val, parent=currentNode)
                break

这消除了任何递归(限制)并且同样具有可读性。

关于python - 大列表的最大递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53038738/

相关文章:

recursion - 学习递归读写

python - 如何消除包含控制流的Python函数中的递归

python - VSCode 调试器附加到本地进程

javascript - 递归遍历树以创建面包屑列表

python - 填充对象-openCV/Python

r - 如何在for循环中迭代参数

java - 为什么键盘给出的循环迭代范围将自身算作一次迭代?

arrays - Numpy 迭代和追加

具有多个条件的Python numpy数组迭代图像

python - Photutils错误: cannot import name 'NUMPY_LT_1_14_1'