簡體   English   中英

大列表的最大遞歸

[英]Maximum recursion with large lists

我正在制作一個包含非常大的列表,將近10000個對象的二叉樹。 問題是由於尺寸太大,我得到了最大的遞歸錯誤。 它特別發生在被調用TreeNode來創建新對象的binarytree類中。 我不確定如何無需遞歸地實現它,因為這似乎是實現代碼的最簡單方法。

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

這擺脫了任何遞歸(限制),並且可讀性強。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM