zoukankan      html  css  js  c++  java
  • 数据结构:二叉树搜索树(八)

    一、二叉搜索树

    二、二叉搜索树初步操作

    1、创建

    class BiTreeNode:
        def __init__(self,data):
            self.data = data
            self.lchild =None
            self.rchild = None
    
    
    class BST:
        def __init__(self,li=None):
            self.root = None
            if li:
                self.root = self.insert(self.root,li[0])
                for val in li[1:]:
                    self.insert(self.root,val) 

    2、遍历

    for i in [1,5,9,8,7,6,4,3,2]:
        tree.insert_no_rec(i)
    tree.in_order(tree.root)
    print(tree.query_no_rec(12))

    中序序列是直接排好序的

    三、二叉树的查询、插入、删除

    1、查询

        def query(self,root,val):
            if not root:
                return False
            if root.data == val:
                return False
            elif root.data > val:
                return self.query(root.lchild, val)
            else:
                return self.query(root.rchild,val)
    
        def query_no_rec(self,val):
            p = self.root
            while p:
                if p.data == val:
                    return True
                elif p.data > val:
                    p = p.lchild
                else:
                    p = p.rchild
            return False

    2、插入

    class BiTreeNode:
        def __init__(self,data):
            self.data = data
            self.lchild =None
            self.rchild = None
    
    
    class BST:
        def __init__(self,li=None):
            self.root = None
            if li:
                self.root = self.insert(self.root,li[0])
                for val in li[1:]:
                    self.insert(self.root,val)
        def insert(self,root,val):
            if root is None:
                root = BiTreeNode(val)
            elif val < root.data:
                root.lchild = self.insert(root.lchild,val)
            else:
                root.rchild = self.insert(root.rchild,val)
            return root
        def insert_no_rec(self,val):
            p = self.root
            if not p:
                self.root = BiTreeNode(val)
                return
            while True:
                if val < p.data:
                    if p.lchild:
                        p = p.lchild
                    else:
                        p.lchild = BiTreeNode(val)
                        break 

    3、删除

    动画演示地址:https://visualgo.net/en/bst

    四、二叉搜索树的问题

    1、随机化的二叉树搜索树

    1、对列表先随机打乱

    2、软后在建树

    2、avl树

    五、B-tree

     MYSQL的数据库索引用的就是B-Tree索引

    六、二叉搜索树代码测试

    1、测试

    1、实现代码

    class BiTreeNode:
        def __init__(self,data):
            self.data = data
            self.lchild = None
            self.rchild = None
    
    
    class BST:
        def __init__(self,li=None):
            self.root = None
            if li:
                self.root = self.insert(self.root,li[0])
                for val in li[1:]:
                    self.insert(self.root,val)
        def insert(self,root,val):
            if root is None:
                root = BiTreeNode(val)
            elif val < root.data:
                root.lchild = self.insert(root.lchild,val)
            else:
                root.rchild = self.insert(root.rchild,val)
            return root
        def insert_no_rec(self,val):
            p = self.root
            if not p:
                self.root = BiTreeNode(val)
                return
            while True:
                if val < p.data:
                    if p.lchild:
                        p = p.lchild
                    else:
                        p.lchild = BiTreeNode(val)
                        break
                else:
                    if p.rchild:
                        p = p.rchild
                    else:
                        p.rchild = BiTreeNode(val)
                        break
    
        def query(self,root,val):
            if not root:
                return False
            if root.data == val:
                return False
            elif root.data > val:
                return self.query(root.lchild, val)
            else:
                return self.query(root.rchild,val)
    
        def query_no_rec(self,val):
            p = self.root
            while p:
                if p.data == val:
                    return True
                elif p.data > val:
                    p = p.lchild
                else:
                    p = p.rchild
            return False
    
        def in_order(self,root):
            if root:
                self.in_order(root.lchild)
                print(root.data,end=',')
                self.in_order(root.rchild)
    
    
    tree = BST()
    for i in [1,5,9,8,7,6,4,3,2]:
        tree.insert_no_rec(i)
    tree.in_order(tree.root)
    print(tree.query_no_rec(12))

    2、输出

    "C:Program FilesPython35python.exe" E:/工作目录/python/test/B-tree.py
    1,2,3,4,5,6,7,8,9,False
    
    Process finished with exit code 0

    2、不打印结果

    1、实现代码

    #print(tree.query_no_rec(12))

    2、输出

    "C:Program FilesPython35python.exe" E:/工作目录/python/test/B-tree.py
    1,2,3,4,5,6,7,8,9,
    Process finished with exit code 0
    

      

  • 相关阅读:
    信号量Semaphore
    回环屏障CyclicBarrier
    线程同步器CountDownLatch
    vue 类似微信通讯录格式实现网易云音乐的歌手字母查询
    vue使用element的多个表格使用v-if切换,使用 :key="Math.random()" 后,表格排序出现问题
    vue使用pinyin的npm包将文字转为大写首字母字母
    vue中使用better-scroll滚动无效
    vue 移动端 图片懒加载 lazy
    表格配合keepalive缓存
    在保存数据之后,不知道什么时候清空数据,不如试试beforeRouteEnter
  • 原文地址:https://www.cnblogs.com/luoahong/p/9719441.html
Copyright © 2011-2022 走看看