Python 3.x TypeError:object()不接受任何参数-python3
我正试图解决一些问题,我可以使用这段代码来学习如何实现二进制搜索树,这段代码是基于原始代码中出现的bug,我认为应该通过执行以下操作来修复这些bug。 编辑此代码以删除语法错误Python 3.x TypeError:object()不接受任何参数-python3,python-3.x,oop,Python 3.x,Oop,我正试图解决一些问题,我可以使用这段代码来学习如何实现二进制搜索树,这段代码是基于原始代码中出现的bug,我认为应该通过执行以下操作来修复这些bug。 编辑此代码以删除语法错误 class TreeNode(object): def __new__(cls, *args, **kwargs): return object.__new__(cls, args, kwargs) def __init__(self, key, val, left=None, righ
class TreeNode(object):
def __new__(cls, *args, **kwargs):
return object.__new__(cls, args, kwargs)
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.leftChild or self.rightChild)
def hasAnyChildren(self):
return self.leftChild or self.rightChild
def hasBothChildren(self):
return self.leftChild and self.rightChild
def replaceNodeData(self, key, value, lc, rc):
self.key = key
self.payload = value
self.leftChild = lc
self.rightChild = rc
if self.hasLeftChild():
self.leftChild.parent = self
if self.hasRightChild():
self.rightChild.parent = self
class BinarySearchTree(TreeNode):
def __init__(self):
# self.root is refrence to TreeNode, which is root
# of primary TreeNode
self.root = None
self.size = 0
def size(self):
return self.size
def __len__(self):
return self.size
def __iter__(self):
return self.root.__iter__()
def put(self, key, val):
# checks if there is root
# if there is a root, lets transverse along tree
if self.root:
self._put(key, val, self.root)
else:
# else if there is not root, lets set a root
# which is a TreeNode instance
self.root = super(BinarySearchTree, cls).__new__(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 = super(BinarySearchTree, cls).__new__(
key, val, parent=currentNode)
else:
if currentNode.hasRightChild():
self._put(key, val, currentNode.rightChild)
else:
currentNode.rightChild = super(BinarySearchTree, cls).__new__(
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
if key == currentNode.key:
return currentNode
if key < currentNode.key:
return self._get(key, currentNode.leftChild)
else:
return self._get(key, currentNode.rightChild)
def __getitem__(self, key):
# this method allows to access instance[index]
# format.
return self.get(key)
def __contains__(self, key):
"""
__contains__ overloads the 'in' operator
allows us to do something simliar to
if 'Northfield' in myZipTree:
print("oom ya ya")
"""
if self._get(key, self.root):
return True
else:
return False
def delete(self, key):
if self.size > 1:
nodeToRemove = self._get(key, self.root)
if nodeToRemove:
self.remove(nodeToRemove)
self.size = self.size - 1
else:
raise KeyError('Error, key was not found')
elif self.size == 1 and self.root.key == key:
self.root = None
self.size = self.size - 1
else:
raise KeyError('Error, key was not found')
def __delitem__(self, key):
self.delete(key)
def remove(self, currentNode):
if currentNode.isLeaf():
# current Leaf has only one child
if currentNode == currentNode.parent.leftChild:
currentNode.parent.leftChild = None
else:
currentNode.parent.rightChild = None
elif currentNode.hasBothChildren():
# interior
succ = currentNode.findSuccessor()
succ.spliceOut()
currentNode.key = succ.key
currentNode.payload = succ.payload
else:
# The node to be deleted has only one child.
if currentNode.hasLeftChild():
if currentNode.isLeftChild():
currentNode.leftChild.parent = currentNode.parent
currentNode.parent.leftChild = currentNode.leftChild
elif currentNode.isRightChild():
currentNode.rightChild.parent = currentNode.parent
currentNode.parent.rightChild = currentNode.rightChild
else:
# this is a root node, replace it's data with it's
# left children
self.replaceNodeData(
currentNode.leftChild.key,
currentNode.leftChild.value,
currentNode.leftChild,
currentNode.rightChild
)
else:
if currentNode.isLeftChild():
currentNode.leftChild.parent = currentNode.parent
currentNode.parent.leftChild = currentNode.leftChild
elif currentNode.isRightChild():
currentNode.rightChild.parent = currentNode.parent
currentNode.parent.rightChild = currentNode.rightChild
else:
# this is a root node, replace it's data with it's
# left children
self.replaceNodeData(
currentNode.leftChild.key,
currentNode.leftChild.value,
currentNode.leftChild,
currentNode.rightChild
)
def __iter__(self):
if self:
if self.hasLeftChild():
for elem in self.leftChiLd:
yield elem
yield self.key
if self.hasRightChild():
for elem in self.rightChild:
yield elem
def findSuccessor(self):
succ = None
if self.hasRightChild():
succ = self.rightChild.findMin()
else:
if self.parent:
if self.hasLeftChild():
succ = self.parent
else:
self.parent.rightChild = None
succ = self.parent.findSuccessor()
self.parent.rightChild = self
return self
def findMin(self):
if self.hasLeftChild():
return self.leftChild.findMin()
else:
return self
def spliceOut(self):
if self.isLeaf():
if self.isLeftChild():
self.parent.leftChild = None
else:
self.parent.rightChild = None
elif self.hasAnyChildren():
if self.hasLeftChild():
if self.isLeftChild():
self.parent.leftChild = self.leftChild
else:
self.parent.rightChild = self.leftChild
self.leftChild.parent = self.parent
else:
if self.isLeftChild():
self.parent.leftChild = self.rightChild
else:
self.parent.rightChild = self.rightChild
self.rightChild.parent = self.parent
mytree = BinarySearchTree()
mytree[17] = "17"
mytree[5] = "5"
mytree[35] = "35"
mytree[2] = "2"
mytree[11] = "11"
mytree[9] = "9"
mytree[16] = "16"
mytree[7] = "7"
mytree[29] = "29"
mytree[38] = "38"
del(mytree[5])
print(mytree[5])
print(mytree[7])
print(mytree.size)
类树节点(对象):
定义(cls,*ARG,**kwargs):
返回对象。\uuuu新建\uuuuu(cls、ARG、kwargs)
定义初始化(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 hasleeftchild(self):
返回self.leftChild
def hasRightChild(自身):
返回自己的右孩子
def isLeftChild(自我):
返回self.parent和self.parent.leftChild==self
def isRightChild(自身):
返回self.parent和self.parent.rightChild==self
def isRoot(自我):
返回非self.parent
def isLeaf(自):
返回not(self.leftChild或self.righchild)
def hasAnyChildren(自我):
返回self.leftChild或self.righchild
def有两个孩子(自己):
返回self.leftChild和self.righchild
def replaceNodeData(自身、键、值、lc、rc):
self.key=key
self.payload=值
self.leftChild=lc
self.rightChild=rc
如果self.hasleeftchild():
self.leftChild.parent=self
如果self.hasRightChild():
self.rightChild.parent=self
类二进制搜索树(TreeNode):
定义初始化(自):
#self.root是对TreeNode的引用,TreeNode是root
#初级树状结构
self.root=None
self.size=0
def大小(自身):
返回自身大小
定义(自我):
返回自身大小
定义(自我):
返回self.root.\u iter\u()
def put(自身、钥匙、val):
#检查是否存在根目录
#如果有根,让我们沿着树横向走
如果self.root:
self.\u put(key、val、self.root)
其他:
#否则,如果没有根,让我们设置一个根
#这是一个TreeNode实例
self.root=super(BinarySearchTree,cls)。\uuuuu new\uuuuuu(key,val)
self.size=self.size+1
def_put(self、key、val、currentNode):
如果key1:
nodeToRemove=self.\u get(键,self.root)
如果要删除,请执行以下操作:
自移除(nodeToRemove)
self.size=self.size-1
其他:
raise KeyError('错误,找不到密钥')
elif self.size==1和self.root.key==key:
self.root=None
self.size=self.size-1
其他:
raise KeyError('错误,找不到密钥')
def uu delitem uu(self,key):
self.delete(键)
def删除(自身,当前节点):
如果currentNode.isLeaf():
#当前叶只有一个子叶
如果currentNode==currentNode.parent.leftChild:
currentNode.parent.leftChild=无
其他:
currentNode.parent.rightChild=无
elif currentNode.hasBothChildren():
#内部
succ=currentNode.findSuccessor()
成功拼接()
currentNode.key=such.key
currentNode.payload=suc.payload
其他:
#要删除的节点只有一个子节点。
如果currentNode.hasLeftChild():
如果currentNode.isLeftChild():
currentNode.leftChild.parent=currentNode.parent
currentNode.parent.leftChild=currentNode.leftChild
elif currentNode.isRightChild():
currentNode.rightChild.parent=currentNode.parent
currentNode.parent.rightChild=currentNode.rightChild
其他:
#这是根节点,将其数据替换为
#留守儿童
自替换节点数据(
currentNode.leftChild.key,
currentNode.leftChild.value,
currentNode.leftChild,
currentNode.rightChild
)
其他:
如果currentNode.isLeftChild():
# vaibhavchauhan @ startup001 in ~/Documents/Projects/interactivepython [19:17:01] C:1
$ python3 binarySearchTreeMod.py
Traceback (most recent call last):
File "binarySearchTreeMod.py", line 248, in <module>
mytree = BinarySearchTree()
File "binarySearchTreeMod.py", line 3, in __new__
return object.__new__(cls, args, kwargs)
TypeError: object() takes no parameters