数据结构:二叉树搜索树(八)

一、二叉搜索树

二、二叉搜索树初步操作

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 Files\Python35\python.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 Files\Python35\python.exe" E:/工作目录/python/test/B-tree.py
1,2,3,4,5,6,7,8,9,
Process finished with exit code 0

  

 

posted @ 2018-09-28 17:04  活的潇洒80  阅读(322)  评论(0编辑  收藏  举报