What is the difference between using a class and a dictionary to represent a binary tree in Python?
在语义学上没有什么大的区别。主要区别在于每种方法的可用性。在
正如您已经观察到的,字典和对象都可以用来表示二叉树。但是,使用对象为二叉树提供了一个更方便和可读的接口。在
为什么?让我们看一个例子。假设你有二叉树:1
/ \
2 3
/ / \
5 7 9
好吧,太好了。现在假设我们要访问树根的右节点。有了字典,看起来像:
^{pr2}$
对象将是:tree.right
好的,现在让我们假设我们要得到正确的节点,右节点的,二叉树的根。换句话说,9。同样,这是使用字典时的效果:tree[tree[1][1]][1]
对象将是:tree.right.right
你开始明白我的意思了吗?当然,对于一个有几个节点的小二叉树来说,使用字典可能看起来不错,但是树越大,你必须走得越深,使用字典的方法就越难看,更不可读。在
当您想开始在二叉树中执行插入和删除之类的操作时,字典方法会变得更糟。执行这些操作需要有一个定义良好的根节点。使用字典进行模拟非常麻烦,因为它没有固定的顺序,与使用对象的层次结构不同:# insertion
def insert(key, root, tree):
if root is None:
return Node(key)
elif key < root:
tree[root][0] = insert(key, tree[root][0], tree)
else:
tree[root][1] = insert(key, tree[root][1], tree)
return root
# deletion
def min_value(node, tree):
current = node
while tree[current][0] is not None:
current = tree[current][0]
return current
def delete(root, key, tree):
if root is None:
return root
if key < root:
tree[root][0] = delete(tree[root][0], key, tree)
elif key < root:
tree[root][1] = delete(tree[root][1], key, tree)
else:
if tree[root][0] is None:
temp = tree[root][1]
return temp
elif tree[root][1] is None:
temp = tree[root][0]
return temp
temp = min_value(tree[root][1], tree)
tree[root] = tree[temp]
tree[temp] = tree.pop(root)
tree[root][1] = delete(tree[root][1], temp)
return root
通过使用诸如left、right和key等命名属性,上述方法的可读性将更加清晰。在
那么,总而言之,使用类和字典来表示二叉树有什么区别呢?区别在于代码的可读性、可用性、可维护性和结构。想要我的建议吗?最后,使用类而不是字典是正确的选择。在