出于某种原因,我似乎无法使用“查找”方法。我认为这与范围问题有关... root.val似乎并没有全局更新。我收到一条错误消息,说AtributeError:'int'对象没有属性'val' 这是我目前的代码:
class BinaryNode:
def __init__(self, v):
self.val = v
self.leftChild = None
self.rightChild = None
def get(self):
return self.val
def set(self, v):
self.val = v
def getChildren(self):
children = []
if self.leftChild != None:
children.append(self.leftChild)
if self.rightChild != None:
children.append(self.rightChild)
return children
class Tree:
def __init__(self):
self.root = None
def setRoot(self, node):
self.root = node
def size(self):
if self.root == None:
return 0
def subtreeSize(node):
return 1 + sum(subtreeSize(c) for c in node.getChildren())
return subtreeSize(self.root)
class BinarySearchTree(Tree):
def insert(self, val):
self.insertNode(self.root, val)
def insertNode(self, node, val):
if node is None:
self.setRoot(BinaryNode(val))
elif val <= node.val:
node.leftChild = insertNode(BinaryNode(val), val)
elif val > node.val:
node.rightChild = insertNode(BinaryNode(val), val)
else:
node.val = val
def find(self, val):
self.findNode(self.root, val)
def findNode(self, node, val):
if node is None:
return False
elif val == node.val:
return True
elif val < node.val:
self.findNode(val, node.leftChild)
else:
self.findNode(val, node.rightChild)
if __name__ == "__main__":
btree = BinarySearchTree()
vals = [5]
for v in vals:
btree.insert(v)
tests = [8, 5]
for t in tests:
print "find(%i) = %s" % (t, ("True" if btree.find(t) else "False"))
答案 0 :(得分:5)
findNode()
方法存在两个问题:
当您递归调用时,交换 node
和val
个参数。这会导致您的代码尝试在整数值而不是节点上查找.val
。
您忘记返回递归调用结果。
更正的方法:
def find(self, val):
return self.findNode(self.root, val)
def findNode(self, node, val):
if node is None:
return False
elif val == node.val:
return True
elif val < node.val:
return self.findNode(node.leftChild, val)
else:
return self.findNode(node.rightChild, val)
您的下一个问题是insertNode
方法;你试图在其中调用全局insertNode()
函数;那可能应该是self.insertNode()
。但是,该方法的没有返回值,因此您最终将node.leftChild
或node.rightChild
设置为None
。
您只想将搜索插入点移交给递归调用,无需使用返回值:
def insert(self, val):
if self.root is None:
self.setRoot(BinaryNode(val))
else:
self.insertNode(self.root, val)
def insertNode(self, node, val):
if val <= node.val:
if node.leftChild:
self.insertNode(node.leftChild, val)
else:
node.leftChild = BinaryNode(val)
elif val > node.val:
if node.rightChild:
self.insertNode(node.rightChild, val)
else:
node.rightChild = BinaryNode(val)
通过这些更改,您可以打印简单的测试:
find(8) = False
find(5) = True
答案 1 :(得分:0)
findNode()
的一个问题是您缺少return
语句。在
elif val < node.val:
self.findNode(val, node.leftChild)
else:
self.findNode(val, node.rightChild)
应该阅读
elif val < node.val:
return self.findNode(val, node.leftChild)
else:
return self.findNode(val, node.rightChild)
insertNode()
中存在类似的问题。