📜  python中的二叉树(1)

📅  最后修改于: 2023-12-03 14:46:39.381000             🧑  作者: Mango

Python中的二叉树

二叉树是一种常用的数据结构,它由根节点、左子树和右子树组成,每个节点最多拥有两个子节点。在Python中,我们可以使用类来实现二叉树。

实现二叉树

定义一个二叉树节点 Node 类:

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

接下来,我们可以创建 BinarySearchTree 类来创建二叉树。

class BinarySearchTree:
    def __init__(self):
        self.root = None

    def insert(self, data):
        if self.root is None:
            self.root = Node(data)
        else:
            self._insert(data, self.root)

    def _insert(self, data, current_node):
        if data < current_node.data:
            if current_node.left is None:
                current_node.left = Node(data)
            else:
                self._insert(data, current_node.left)
        elif data > current_node.data:
            if current_node.right is None:
                current_node.right = Node(data)
            else:
                self._insert(data, current_node.right)
        else:
            print("Value is already in tree.")

    def __contains__(self, data):
        if self.root:
            return self._contains(data, self.root)
        else:
            return False

    def _contains(self, data, current_node):
        if current_node is None:
            return False
        elif current_node.data == data:
            return True
        elif data < current_node.data:
            return self._contains(data, current_node.left)
        else:
            return self._contains(data, current_node.right)
遍历二叉树

遍历二叉树是指按照一定的顺序访问树中的每个节点。常见的遍历方式有前序遍历、中序遍历和后序遍历。

依然在 BinarySearchTree 类中,我们可以增加三个方法,用于实现不同的遍历方式。

前序遍历

前序遍历的顺序是:根节点 -> 左子树 -> 右子树。代码实现:

def pre_order(self):
    if self.root is not None:
        self._pre_order(self.root)

def _pre_order(self, current_node):
    if current_node is not None:
        print(current_node.data)
        self._pre_order(current_node.left)
        self._pre_order(current_node.right)
中序遍历

中序遍历的顺序是:左子树 -> 根节点 -> 右子树。代码实现:

def in_order(self):
    if self.root is not None:
        self._in_order(self.root)

def _in_order(self, current_node):
    if current_node is not None:
        self._in_order(current_node.left)
        print(current_node.data)
        self._in_order(current_node.right)
后序遍历

后序遍历的顺序是:左子树 -> 右子树 -> 根节点。代码实现:

def post_order(self):
    if self.root is not None:
        self._post_order(self.root)

def _post_order(self, current_node):
    if current_node is not None:
        self._post_order(current_node.left)
        self._post_order(current_node.right)
        print(current_node.data)
进一步扩展

除了基础功能,我们还可以在 BinarySearchTree 类中添加其他方法,如查找最小值、最大值、删除节点等。二叉树的各种操作能够极大地帮助我们解决实际问题,是编程中值得深入了解的一个重要数据结构。