什么是二叉搜索树
二叉搜索树(Binary Search Tree),又称二叉查找树、有序二叉树,是指一棵空树或者具有下列性质的二叉树:
- 若任意节点的左子树不空,则左子树上所有节点的值均小于它的根节点的值;
- 若任意节点的右子树不空,则右子树上所有节点的值均大于它的根节点的值;
- 任意节点的左、右子树也分别为二叉搜索树;
- 没有键值相等的节点。
Python实现二叉搜索树
Python实现二叉搜索树,可以借助类的概念,定义一个节点类,用来描述每一个节点,并且定义一个根节点类,用来描述整棵树。
# 定义节点类
class Node(object):
def __init__(self, data, left=None, right=None):
self.data = data # 节点数据
self.left = left # 左子树
self.right = right # 右子树
# 定义根节点类
class BST(object):
def __init__(self, root=None):
self.root = root # 根节点
二叉搜索树的基本操作
二叉搜索树的基本操作有插入、查找、删除和遍历四种。
1. 插入
插入操作是构建二叉搜索树的基础操作,在插入新的节点时,要保证二叉搜索树的性质不变,即要保证插入新节点后,仍然是一棵二叉搜索树。
# 插入操作
def insert(self, data):
if self.root is None:
self.root = Node(data)
else:
self.__insert(self.root, data)
def __insert(self, node, data):
if node.data > data:
if node.left is None:
node.left = Node(data)
else:
self.__insert(node.left, data)
else:
if node.right is None:
node.right = Node(data)
else:
self.__insert(node.right, data)
2. 查找
查找操作是查询某一个节点是否存在于二叉搜索树中,要判断根节点是否为空,如果不为空,则进行查找操作,如果为空,则返回False。
# 查找操作
def search(self, data):
if self.root is None:
return False
else:
return self.__search(self.root, data)
def __search(self, node, data):
if node.data == data:
return True
elif node.data > data:
if node.left is None:
return False
else:
return self.__search(node.left, data)
else:
if node.right is None:
return False
else:
return self.__search(node.right, data)
3. 删除
删除操作是删除某一个节点,同时保证二叉搜索树的性质不变,删除操作可以分为三种情况:删除叶子节点、删除只有一个子节点的节点和删除有两个子节点的节点。
# 删除操作
def delete(self, data):
if self.root is None:
return False
else:
return self.__delete(self.root, data)
def __delete(self, node, data):
if node is None:
return False
if node.data > data:
node.left = self.__delete(node.left, data)
elif node.data < data:
node.right = self.__delete(node.right, data)
else:
# 删除叶子节点
if node.left is None and node.right is None:
node = None
# 删除只有一个子节点的节点
elif node.left is None:
node = node.right
elif node.right is None:
node = node.left
# 删除有两个子节点的节点
else:
# 找到右子树中的最小值
min_node = self.__find_min(node.right)
node.data = min_node.data
node.right = self.__delete(node.right, min_node.data)
return node
def __find_min(self, node):
if node.left is None:
return node
else:
return self.__find_min(node.left)
4. 遍历
遍历操作是按照某