class Node:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
class Tree:
def __init__(self):
self.root = None
self.size = 0
def add_node(self, data):
self.root = self._add_node(data, self.root)
self.size += 1 # we're about to add a new node, so we have one more element!
def _add_node(self, data, node):
node_to_add = Node(data)
if not node:
return node_to_add
if node.data >= node_to_add.data:
node.left = self._add_node(data, node.left)
elif node.data < node_to_add.data:
node.right = self._add_node(data, node.right)
return node
def print_tree(self):
self._print_tree(self.root)
def _print_tree(self, starting_node):
if starting_node is None:
return
self._print_tree(starting_node.left)
print starting_node.data,
self._print_tree(starting_node.right)
def count_number_nodes(self):
return self._count_number_of_nodes(self.root)
def _count_number_of_nodes(self, starting_node):
num = 1
if starting_node.left is not None:
num += self._count_number_of_nodes(starting_node.left)
if starting_node.right is not None:
num += self._count_number_of_nodes(starting_node.right)
return num
tree = Tree()
tree.add_node(10)
tree.add_node(42)
tree.add_node(1)
tree.add_node(-14)
tree.add_node(32)
tree.add_node(12)
print "printing in order traversal of tree (smallest to biggest)"
tree.print_tree()
print "size from member variable: " + str(tree.size)
print "size from method call: " + str(tree.count_number_nodes())
输出
^{pr2}$
在这个例子中,我包含了两种检索大小的方法,一种是跟踪成员变量,另一种是根据树中的节点数计算大小。在
成员变量方法速度更快,值得推荐,因为这是一个单独的操作来获取树的大小。使用该方法时,它对每个节点进行计数。这使得它的时间复杂度为O(n)vs成员变量访问的O(1)。在
但是,为了使size变量精确,您必须在向树中添加新节点的方式上保持一致,例如tree.root.左=节点(6),这不会增加size变量,那么它将不准确。在
这个例子是BST(二进制搜索树)的一个基本实现,BST有一个属性,它表示树中的一个节点必须有0到2个子节点,左节点必须小于该节点,右节点必须大于该节点。小于和大于取决于节点中的数据类型。在
我希望这个例子能有所帮助。在