当前位置:   article > 正文

二叉排序树实现(Python)_python二叉排序最简单写法

python二叉排序最简单写法

基本概念

定义: 二叉排序树或者是空树,或者满足以下性质

  1. 若它的左子树不空,则左子树上所有节点的值均小于根节点的值
  2. 若它的右子树不空,则右子树上所有节点的值均大于根节点的值
  3. 左右子树又各是一颗二叉排序树

注: 二叉排序树的中序遍历为递增有序序列

数据结构:

class Node():
    def __init__(self,value):
        self.value = value
        self.left = None
        self.right = None
  • 1
  • 2
  • 3
  • 4
  • 5

二叉排序树查找

def BST_serach(root, value):
    if not root: # 遇到空节点,未找到
        return False
    if root.value == value: # 找到
        return True
    elif value < root.value: # 若值小于根节点值,继续从左子树中查找
        return BST_serach(root.left, value)
    else: # 否则,该值大于根节点的值,从右子树中查找
        return BST_serach(root.right, value)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

二叉排序树插入

对于一个不存在于二叉排序树中的值,其查找不成功的位置即为该值的插入位置
因此,只需要在找到空指针的时候,进行插入

def BST_insert(root, value):
    if not root: # 遇到空节点,即为插入位置
        root = Node(value)
        return
    if root.value == value: # 若该值已存在于二叉树中,插入失败
        print("Existed!!!")
        return
    elif value < root.value: # 若值小于根节点值,继续从左子树中查找插入位置
        if not root.left: # 该判断不可删除,会出现无法插入的问题,原因尚未知
            root.left = Node(value)
            return
        BST_insert(root.left, value)
        # 注:以上四句不可用 return self.BST_insert(root.right, value)代替,
        # 会出现节点无法插入的问题
    else: # 否则,该值大于根节点的值,从右子树中查找插入位置
        if not root.right:
            root.right = Node(value)
            return
        BST_insert(root.right, value)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

完整类实现

class BSTree():
    def __init__(self, root):
        self.root = root
    
    def serach(self, value):
        return self.BST_serach(self.root, value)
    
    def insert(self, value):
        self.BST_insert(self.root, value)
    
    def print_tree(self):
        self.BST_print(self.root)
    
    def BST_insert(self, root, value):
        if not root: # 遇到空节点,即为插入位置
            print("Insert!!!")
            root = Node(value)
            return
        if root.value == value: # 若该值已存在于二叉树中,插入失败
            print("Existed!!!")
            return
        elif value < root.value: # 若值小于根节点值,继续从左子树中查找插入位置
            if not root.left:
                print("Insert!!!")
                root.left = Node(value)
                return
            self.BST_insert(root.left, value)
        else: # 否则,该值大于根节点的值,从右子树中查找插入位置
            if not root.right:
                print("Insert!!!")
                root.right = Node(value)
                return
            self.BST_insert(root.right, value)
            # 注:以上四句不可用 return self.BST_insert(root.right, value)代替
            # 会出现节点无法插入的问题
    
    def BST_serach(self, root, value):
        if not root: # 遇到空节点,未找到
            return False
        if root.value == value: # 找到
            return True
        elif value < root.value: # 若值小于根节点值,继续从左子树中查找
            return self.BST_serach(root.left, value)
        else: # 否则,该值大于根节点的值,从右子树中查找
            return self.BST_serach(root.right, value)
    
    def BST_print(self, root):
        """Middle Serach"""
        if not root:
            return
        
        self.BST_print(root.left)
        print(root.value)
        self.BST_print(root.right)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54

删除操作较复杂,暂未编写

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号