[英]Binary Search Tree operations
我正在尝试在python中实现二进制搜索树操作。 到目前为止,我已经编写了一些代码以将节点添加到此搜索树中(已排序)。 这是我在代码中的内容:
class TreeNode:
def __init__(self, data):
self.data = data
self.lLink = None
self.rLink = None
class BinaryTree:
def __init__(self):
self.root = None
def AddNode(self, data):
if self.root is None:
self.root = TreeNode(data)
else:
if data < self.root.data:
if self.root.lLink is None:
self.root.lLink = TreeNode(data)
else:
AddNode(self.root.lLink, data)
else:
if self.root.rLink is None:
self.root.rLink = TreeNode(data)
else:
AddNode(self.root.rLink, data)
def InOrder(self, head):
if self.root.lLink is not None:
InOrder(self.root.lLink)
print self.root.data,
if self.root.rLink is not None:
InOrder(self.root.rLink)
myTree = BinaryTree()
myTree.AddNode(15)
myTree.AddNode(18)
myTree.AddNode(14)
如何测试我的AddNode()
方法是否正确? 我知道算法,但可以肯定。 我当时想的是创建一个InOrder()方法并尝试通过此InOrder遍历打印元素。 结果,应该将我添加到树中的数据以排序的顺序显示。 如果按排序顺序显示,我将确保AddNode()和InOrder()方法均正确。
您的BinaryTree
类有问题,将插入顺序更改为
myTree.AddNode(14)
myTree.AddNode(18)
myTree.AddNode(15)
引发错误NameError: global name 'AddNode' is not defined
。
这是因为在代码行AddNode(self.root.rLink, data)
和AddNode(self.root.lLink, data)
您似乎在TreeNode
实例上调用AddNode
函数,而这是不可能的。 我已修复您代码中的一些错误,现在应该可以正常工作了。
class TreeNode:
def __init__(self, data):
self.data = data
self.lLink = None
self.rLink = None
class BinaryTree:
def __init__(self):
self.root = None
def AddNode(self, data):
if self.root is None:
self.root = TreeNode(data)
else:
self.AddHelper(data, self.root)
def AddHelper(self, data, startingPoint):
if data < startingPoint.data:
if startingPoint.lLink is None:
startingPoint.lLink = TreeNode(data)
else:
self.AddHelper(data, startingPoint.lLink)
else:
if startingPoint.rLink is None:
startingPoint.rLink = TreeNode(data)
else:
self.AddHelper(data, startingPoint.rLink)
def InOrder(self):
self.InOrderHelper(self.root)
def InOrderHelper(self, startingPoint):
if startingPoint is None:
return
self.InOrderHelper(startingPoint.lLink)
print startingPoint.data,
self.InOrderHelper(startingPoint.rLink)
输出测试:
>>> myTree = BinaryTree()
>>> myTree.AddNode(14)
>>> myTree.AddNode(18)
>>> myTree.AddNode(15)
>>> myTree.InOrder()
14 15 18
插入可能会有些棘手,特别是因为函数是树本身的一部分。 因此,您在树上调用insert函数,但指定了起点。 默认为root,因此在调用函数时可以保留参数。
另外,我认为您对self
在函数中的工作方式尚不清楚。 您不能将它作为参数传递给函数,这似乎已经完成。
class TreeNode:
def __init__(self, data):
self.data = data
self.rLink = None
self.lLink = None
class BinaryTree:
def __init__(self):
self.root = None
def AddNode(self, data, node=None):
if not node :
node = self.root
if self.root is None:
self.root = TreeNode(data)
else:
if data < node.data:
if node.lLink is None:
node.lLink = TreeNode(data)
else:
self.AddNode(data, self.root.lLink)
else:
if node.rLink is None:
node.rLink = TreeNode(data)
else:
self.AddNode(data, self.root.rLink)
def InOrder(self, head):
if head.lLink is not None:
self.InOrder(head.lLink)
print head.data,
if head.rLink is not None:
self.InOrder(head.rLink)
myTree = BinaryTree()
myTree.AddNode(14)
myTree.AddNode(15)
myTree.AddNode(18)
myTree.InOrder(myTree.root)
最好按顺序遍历测试插入功能。
这应该工作。 如果每次都使用self.root.lLink
那么您就不会倒下。 (可选)您可以再编写一行代码,以检查输出是否确实按升序排列。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.