所以我正在实现一个二进制搜索树,但我对是否应该有Node class
以及Bst class
或只有一个类感到困惑。
之所以如此,是因为我知道BST是由节点组成的,但在任何时候你都可以获取一个节点及其下面的所有节点,而且本质上也是一个BST。
如果我有以下代码,那么我在插入时可以调用我的代码self.left.insert(data)
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)
如果我按照Node
和BST
这两个单独的事情的另一种方式执行,那么在我的插入方法中我有self.insert(data, node.left)
:
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)
所以我的问题是更好的代码self.insert(data, node.left)
或self.left.insert(data)
。
我认为self.left.insert(data)
就像用户插入时一样,他们只需要写bst.insert(5)
,就像他们说的另一个bst.insert(bst.root, 5)
答案 0 :(得分:1)
我认为第二个更好。算法与数据结构分离,带来更大的灵活性。例如,涉及父节点的删除操作比第一个更容易实现。
答案 1 :(得分:0)
自从我发表评论以来,我一直在思考为什么我喜欢第一种方法。我得出结论,我喜欢第一种方法的原因是,对我来说,第二种方式唯一的做法就是增加复杂性。您将所有方法移出Node类并进入另一个类。
qiangwant提出了一个关于将算法与数据结构分离的观点。我不确定我是否完全看到了它,但即便如此,为什么一个新类,为什么不直接定义类之外的函数呢?好的,BST
类跟踪根,但不能保证您所处理的节点与BST
对象存储的根节点有关。所以我看到它,而不是让一个BST
对象和一个节点对象来进行操作,你也可以拥有一个名为root的节点对象和另一个进行操作的节点对象。
当然,如果要在节点类之外定义函数,那么在def function(node, other args...)
形式的函数上就会有很多函数,这正是类方法的用法。