创建BST:python的最佳实践
因此,我正在实现一个二叉搜索树,但我不知道是应该有一个创建BST:python的最佳实践,python,insert,binary-search-tree,Python,Insert,Binary Search Tree,因此,我正在实现一个二叉搜索树,但我不知道是应该有一个节点类,还是应该有一个Bst类,还是只有一个类 原因是因为我知道BST是由节点组成的,但在任何时候你都可以获取一个节点和它下面的所有节点,这本质上也是一个BST 如果我有下面的代码,它是一件事,那么当我插入时,我可以像这样调用我的代码self.left.insert(data) 所以我的问题是,哪一个更好的代码是self.insert(data,node.left)还是self.left.insert(data) 我假设当用户插入时,他们只需
节点类
,还是应该有一个Bst类
,还是只有一个类
原因是因为我知道BST是由节点组成的,但在任何时候你都可以获取一个节点和它下面的所有节点,这本质上也是一个BST
如果我有下面的代码,它是一件事,那么当我插入时,我可以像这样调用我的代码self.left.insert(data)
所以我的问题是,哪一个更好的代码是self.insert(data,node.left)
还是self.left.insert(data)
我假设当用户插入时,他们只需编写
bst.insert(5)
,其中与另一个一样,他们说bst.insert(bst.root,5)
,我认为第二个更好。算法与数据结构分离,带来更大的灵活性。例如,涉及父节点的删除操作在第二种方法中比在第一种方法中更容易实现。自从我发表评论以来,我一直在思考为什么我喜欢第一种方法。我得出的结论是,我喜欢第一种方法的原因是,对我来说,第二种方法唯一能做的就是增加复杂性。将所有方法移出Node类,然后移到另一个类中
强旺特提出了算法与数据结构分离的观点。我不确定我是否完全看到了它,但即使如此,为什么要创建一个新类,为什么不在类之外定义函数呢
好的,BST
类跟踪根节点,但是不能保证您正在处理的节点与BST
对象存储的根节点有任何关系。因此,在我看来,与其让一个BST
对象和一个node对象对其执行操作,不如让一个名为root的node对象和另一个对象对其执行操作
当然,如果您要在node类之外定义函数,那么您将在
def function(node,other args…
)的形式上有一大堆函数,这正是类方法的用途。不久前我在Java中也做过类似的事情。只是我的树必须实现TreeModel
接口,它的工作原理与第二个示例类似。不过,我更喜欢第一种方法,因此我最终实现了第一个示例中的树,然后提供了一个包装器类,使其符合TreeModel
接口。我意识到这不是真正的答案,只是我说我喜欢一件事而不是另一件事(这就是为什么我将此作为评论发布)不一定你可以只跟踪当前节点和父节点,但第二个更直观,尤其是当操作涉及更多节点时。
class Bst():
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def insert(self, data):
node_to_insert = Bst(data)
if data < self.data:
if self.left is None:
self.left = Bst(data)
else:
self.left.insert(data)
else:
if self.right is None:
self.right = Bst(data)
else:
self.right.insert(data)
class Node():
def __init__(self, data):
self.data = data
self.left = None
self.right = None
class Bst():
def __init__(self, root=None):
self.root = root
def insert(self, data, node):
node_to_insert = Node(data)
if node is None:
node = node_to_insert
else:
if data < node.data:
if node.left is None:
node.left = node_to_insert
else:
self.insert(data, node.left)
else:
if node.right is None:
node.right = node_to_insert
else:
self.insert(data, node.right)