python树结构 数据库_Python树数据结构

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

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个子节点,左节点必须小于该节点,右节点必须大于该节点。小于和大于取决于节点中的数据类型。在

我希望这个例子能有所帮助。在

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值