在Python中实现二叉树

2023-04-11 00:00:00 python 二叉树

二叉树是一种树形数据结构,其中每个节点最多有两个子节点,分别称为左子节点和右子节点。在Python中,我们可以使用类和对象来表示和操作二叉树。下面是一个示例代码,演示如何实现二叉树。

class Node:
    def __init__(self, value):
        self.value = value
        self.left = None
        self.right = None

class BinaryTree:
    def __init__(self, root):
        self.root = Node(root)

    def insert(self, node, value):
        if node is None:
            return
        if node.left is None:
            node.left = Node(value)
        elif node.right is None:
            node.right = Node(value)
        else:
            self.insert(node.left, value)

    def breadth_first_search(self):
        queue = [self.root]
        while queue:
            current_node = queue.pop(0)
            print(current_node.value, end=' ')
            if current_node.left is not None:
                queue.append(current_node.left)
            if current_node.right is not None:
                queue.append(current_node.right)

    def depth_first_search(self, order='in_order'):
        if order == 'pre_order':
            self._pre_order_traversal(self.root)
        elif order == 'in_order':
            self._in_order_traversal(self.root)
        elif order == 'post_order':
            self._post_order_traversal(self.root)

    def _pre_order_traversal(self, node):
        if node is None:
            return
        print(node.value, end=' ')
        self._pre_order_traversal(node.left)
        self._pre_order_traversal(node.right)

    def _in_order_traversal(self, node):
        if node is None:
            return
        self._in_order_traversal(node.left)
        print(node.value, end=' ')
        self._in_order_traversal(node.right)

    def _post_order_traversal(self, node):
        if node is None:
            return
        self._post_order_traversal(node.left)
        self._post_order_traversal(node.right)
        print(node.value, end=' ')

在这个示例代码中,我们定义了两个类:Node和BinaryTree。Node类表示树的节点,其中包含值和左子节点、右子节点属性。BinaryTree类表示整个二叉树,它有一个根节点属性,并且可以实现节点的插入和搜索操作。具体来说,我们实现了两种搜索方法:广度优先搜索和深度优先搜索。在深度优先搜索中,我们可以指定遍历的顺序:前序、中序和后序。

下面是一个使用示例,演示如何创建一个二叉树,并使用不同的搜索方法遍历它。

tree = BinaryTree('pidancode.com')
tree.insert(tree.root, 'hello')
tree.insert(tree.root, 'world')
tree.insert(tree.root, 'python')
tree.insert(tree.root.left, 'is')
tree.insert(tree.root.right, 'fun')
tree.insert(tree.root.right.right, '!')
tree.breadth_first_search()  # pidancode.com hello world python is fun !
print()
tree.depth_first_search(order='pre_order')  # pidancode.com hello is world python fun !
print()
tree.depth_first_search(order='in_order')  # is hello pidancode.com python world fun !
print()
tree.depth_first_search(order='post_order')  # is hello python fun world pidancode.com !

在上面的示例中,我们首先创建了一个二叉树,然后向其中插入了一些节点。接着,我们分别使用广度优先搜索和深度优先搜索遍历了整个树,并输出了每个节点的值。可以看到,不同的搜索方法遍历二叉树的顺序是不同的,这反映了深度优先搜索算法的不同实现方式。

相关文章