二叉排序树
也称二叉搜索树,是一种特殊的二叉树。它满足以下条件:
- 左子树中所有节点的键值均小于根节点的键值
- 右子树中所有节点的键值均大于根节点的键值
- 左子树和右子树都是二叉排序树
因为满足这些条件,所以二叉排序树是一个有序的数据结构,可以用于查找、插入和删除操作。其中,查找操作的时间复杂度为O(logn),跟树的高度有关,插入和删除操作的时间复杂度也为O(logn)。
下面是一个示例的二叉排序树:
6
/ \
4 8
/ \ / \
2 5 7 9
其中,根节点的键值为6,左子树中所有节点的键值均小于6,右子树中所有节点的键值均大于6。左子树和右子树都是二叉排序树。可以看出,这个二叉排序树中所有节点的键值都不相同。
二叉排序树的实现方式很多,可以使用链式存储结构或者数组存储结构。下面是一个使用链式存储结构的示例代码,其中,节点结构体包含键值、左子节点指针和右子节点指针:
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
class BinarySearchTree:
def __init__(self):
self.root = None
def insert(self, val):
if not self.root:
self.root = TreeNode(val)
else:
self._insert(self.root, val)
def _insert(self, node, val):
if val < node.val:
if not node.left:
node.left = TreeNode(val)
else:
self._insert(node.left, val)
else:
if not node.right:
node.right = TreeNode(val)
else:
self._insert(node.right, val)
def search(self, val):
return self._search(self.root, val)
def _search(self, node, val):
if not node or node.val == val:
return node
elif val < node.val:
return self._search(node.left, val)
else:
return self._search(node.right, val)
在二叉排序树中,若插入的数据是有序的,则二叉排序树将会退化成一条链表,这时候查找操作的时间复杂度将会退化为 O ( n ) O(n) O(n),其中 n n n 是二叉排序树中节点的数量。因此,对于二叉排序树的设计和实现,需要考虑如何避免或减少树的退化。常用的方法包括平衡二叉树、红黑树、AVL树等。
平衡二叉树
平衡二叉树,也称为自平衡二叉搜索树,是一种二叉排序树,它保持树的左右子树的高度差不超过1,从而保证了树的平衡性。平衡二叉树的常见实现包括红黑树、AVL树、B树等。
相对于普通的二叉排序树,平衡二叉树的优点在于其查找、插入、删除操作的时间复杂度为O(logn),其中n为树中节点的个数。这是因为平衡二叉树在插入和删除操作时会通过旋转操作调整树的平衡,从而避免了树的高度过大而导致的性能问题。
平衡二叉树的缺点在于它的实现比普通的二叉排序树更为复杂,同时它需要维护额外的平衡信息,导致了空间开销更大。