Python实现二叉搜索树的详细解析及示例

分类:知识百科 日期: 点击:0

什么是二叉搜索树

二叉搜索树(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. 遍历

遍历操作是按照某

标签:

版权声明

1. 本站所有素材,仅限学习交流,仅展示部分内容,如需查看完整内容,请下载原文件。
2. 会员在本站下载的所有素材,只拥有使用权,著作权归原作者所有。
3. 所有素材,未经合法授权,请勿用于商业用途,会员不得以任何形式发布、传播、复制、转售该素材,否则一律封号处理。
4. 如果素材损害你的权益请联系客服QQ:77594475 处理。