📜  树 (1)

📅  最后修改于: 2023-12-03 15:26:41.005000             🧑  作者: Mango

树是一种非常重要和常用的数据结构,它是由多个节点组成的集合,节点之间通过边进行连接。

树的每个节点有一个父节点和多个子节点,除了根节点没有父节点,其他节点都有一个唯一的父节点。

树的节点可以有任意数量的子节点,但在计算机科学中,常见的树结构包括二叉树、红黑树和AVL树等。

二叉树

二叉树是一种树结构,它的每个节点最多只有两个子节点,分别称为左子节点和右子节点。

二叉树最常见的应用是在二叉搜索树中,它能够帮助我们高效地进行数据搜索。

在二叉搜索树中,对于任何节点,它的左子树的值都小于该节点的值,右子树的值都大于该节点的值。这种结构可以帮助我们快速地查找一个值是否存在于树中。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

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

    def insert(self, val):
        if not self.root:
            self.root = TreeNode(val)
            return

        node = self.root
        while node:
            if val < node.val:
                if not node.left:
                    node.left = TreeNode(val)
                    return
                node = node.left
            else:
                if not node.right:
                    node.right = TreeNode(val)
                    return
                node = node.right

    def search(self, val):
        node = self.root
        while node:
            if val == node.val:
                return True
            elif val < node.val:
                node = node.left
            else:
                node = node.right
        return False
红黑树

红黑树是一种自平衡的二叉搜索树,它能够保证在最糟糕的情况下,各种基本操作都能在O(log2n)时间内完成。

红黑树的节点有两种颜色:红色和黑色。树中还需满足以下性质:

  1. 根节点必须为黑色;
  2. 红色节点的父节点必须为黑色;
  3. 每个叶子节点都是黑色;
  4. 每个节点都要么是红的,要么是黑的;
  5. 从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点。
class RBNode:
    def __init__(self, key, left=None, right=None):
        self.key = key
        self.left = left
        self.right = right
        self.color = 'R'


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

    def is_red(self, node):
        return node is not None and node.color == 'R'

    def rotate_left(self, node):
        right = node.right
        node.right = right.left
        right.left = node
        right.color = node.color
        node.color = 'R'
        return right

    def rotate_right(self, node):
        left = node.left
        node.left = left.right
        left.right = node
        left.color = node.color
        node.color = 'R'
        return left

    def flip_colors(self, node):
        node.color = 'R'
        node.left.color = 'B'
        node.right.color = 'B'

    def insert(self, key):
        def insert_node(node, key):
            if node is None:
                return RBNode(key)

            if key < node.key:
                node.left = insert_node(node.left, key)
            elif key > node.key:
                node.right = insert_node(node.right, key)

            if self.is_red(node.right) and not self.is_red(node.left):
                node = self.rotate_left(node)
            if self.is_red(node.left) and self.is_red(node.left.left):
                node = self.rotate_right(node)
            if self.is_red(node.left) and self.is_red(node.right):
                self.flip_colors(node)

            return node

        self.root = insert_node(self.root, key)
        self.root.color = 'B'
AVL树

AVL树是一种自平衡二叉搜索树,它能够保证任何节点的两个子树高度之差不大于1。

AVL树的节点需要保存高度信息,对树的每个节点进行插入和删除操作时,需要通过旋转子树来维持平衡。

下面是AVL树的Python实现示例:

class AVLNode:
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.height = 1
        self.left = left
        self.right = right


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

    def insert(self, val):
        def get_height(node):
            return node.height if node else 0

        def rotate_left(node):
            r = node.right
            node.right = r.left
            r.left = node

            node.height = max(get_height(node.left), get_height(node.right)) + 1
            r.height = max(get_height(r.left), get_height(r.right)) + 1
            return r

        def rotate_right(node):
            l = node.left
            node.left = l.right
            l.right = node

            node.height = max(get_height(node.left), get_height(node.right)) + 1
            l.height = max(get_height(l.left), get_height(l.right)) + 1
            return l

        def get_balance(node):
            return get_height(node.left) - get_height(node.right)

        def insert_node(node, val):
            if not node:
                return AVLNode(val)

            if val < node.val:
                node.left = insert_node(node.left, val)
            else:
                node.right = insert_node(node.right, val)

            node.height = max(get_height(node.left), get_height(node.right)) + 1

            balance = get_balance(node)
            if balance > 1 and val < node.left.val:
                return rotate_right(node)
            if balance < -1 and val > node.right.val:
                return rotate_left(node)
            if balance > 1 and val > node.left.val:
                node.left = rotate_left(node.left)
                return rotate_right(node)
            if balance < -1 and val < node.right.val:
                node.right = rotate_right(node.right)
                return rotate_left(node)

            return node

        self.root = insert_node(self.root, val)

以上是树的介绍和三种常见的树结构的Python实现代码片段,欢迎给出你的宝贵意见。