二叉排序树(4)

二叉排序树(Binary Sort Tree),亦称二叉搜索。

特点:

(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
平均查找长度= 每个结点的深度的总和 / 总结点数
 
二叉排序树的搜索:
class BTNode:
    def __init__(self, data, left, right):
        self.data = data
        self.left = left
        self.right = right
 
 
class BTree:
    def __init__(self, root):
        self.root = root;
 
    def insert(self, value):
        self.insertNode(value, self.root)
 
    def insertNode(self, data, btnode):
        if btnode == None:
            btnode = BTNode(data, None, None)
        elif data < btnode.data:
            if btnode.left == None:
                btnode.left = BTNode(data, None, None)
                return
 
            self.insertNode(data, btnode.left)
        elif data > btnode.data:
            if btnode.right == None:
                btnode.right = BTNode(data, None, None)
                return
 
            self.insertNode(data, btnode.right)
 
    def printBTreeImpl(self, btnode):
        if btnode == None:
            return
 
        self.printBTreeImpl(btnode.left)
        print(btnode.data)
        self.printBTreeImpl(btnode.right)
 
    def printBTree(self):
        self.printBTreeImpl(self.root)
 
 
if __name__ == '__main__':
 
    root = BTNode(2, None, None)
    btree = BTree(root)
    for i in [5, 8, 3, 1, 4, 9, 0, 7]:
        btree.insert(i)
    btree.printBTree()
View Code
def searchBintree(tree,num):
    if tree == 0:
        return False
    if num == tree[0]:
        return True
    if num < tree[0]:
        return searchBintree(tree[1],num)
    if num > tree[0]:
        return searchBintree(tree[2],num)

def insert1(tree,num):
    if tree == []:
        tree.extend([num,[],[]])
    elif num<=tree[0]:
        insert1(tree[1],num)
    elif num >= tree[0]:
        insert1(tree[2],num)

def getmax(tree):
    if tree[2]==[]:
        x=tree[0]
        if tree[1] != []:
            tree[:]=tree[1]
        else:
            tree.clear()
        return x
    else:
        return getmax(tree[2])
def delete(tree,num):
    if tree == []:
        return False
    if num < tree[0]:
        return delete(tree[1],num)
    elif num > tree[0]:
        return delete(tree[2],num)
    else:
        if tree[1]==[] and tree[2]==[]:
            tree.clear()
        elif tree[1]==[]:
            tree[:]==tree[2]
        elif tree[2]==[]:
            tree[:]=tree[1]
        else:
            max = getmax(tree[1])
            tree[0]=max
        return True


if __name__ == "__main__":
    mytree=[30,[15,[12,[],[]],[23,[],[]],],[52,[],[74,[],[]],]]
    num = int(input("num:"))
    print(searchBintree(mytree,num))
    print(insert1(mytree,num))
    print(delete(mytree,num))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/topass123/p/12655829.html