📅  最后修改于: 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)时间内完成。
红黑树的节点有两种颜色:红色和黑色。树中还需满足以下性质:
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树是一种自平衡二叉搜索树,它能够保证任何节点的两个子树高度之差不大于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实现代码片段,欢迎给出你的宝贵意见。