算法之路--二叉排序树

二叉树由父节点、左子节点和右子节点的单元结构组成,形状有如倒立的树。若树中左子节点的元素值小于父节点,而右子节点的元素值大于父节点,则树为二叉排序树。经过前序或后序遍历排序树,可以得到排序好的序列。二叉排序树的搜索复杂度与树的平衡性有关。一组数据按序构建二叉排序树,会导致二叉排序树退化为链表结构,搜索时间复杂度为O(n)。若二叉排序树比较平衡,则搜索时间复杂度为O(logn)。

# _*_ coding:utf-8 _*_
class Node:
    def __init__(self,element=None):
        self.leftNode = None
        self.rightNode = None
        self.element =element

class MyBinaryTree:

    def __init__(self):
        self.root = Node()
    def add(self,element):
        if element==None:
            return
        if self.root.element==None:
            self.root.element=element
            return
        p=self.root
        newNode = Node(element)
        while(p !=None):
            if (element<=p.element):
                if p.leftNode==None:
                    p.leftNode=newNode
                    return
                p=p.leftNode
            else:
                if p.rightNode==None:
                    p.rightNode=newNode
                    return
                p=p.rightNode
    def preForeach(self,p):
        if p==None:
            return
        leftNode=p.leftNode
        rightNode=p.rightNode
        self.preForeach(leftNode)
        print(p.element)
        self.preForeach(rightNode)
    def search(self,element):
        p=self.root
        while(p!=None):
            if (element<p.element):
                p=p.leftNode
            elif(element==p.element):
                return True
            else:
                p=p.rightNode

    def delete(self,element):
        p=self.root
        pp = None
        while (p != None and p.element !=element):
            pp=p
            if element<p.element:
                p=p.leftNode
            elif element>p.element:
                p=p.rightNode
        if p==None:
            return
        if(p.rightNode !=None and p.leftNode!=None):
            minpp=p
            minp=p.rightNode
            while(minp.leftNode !=None):
                minpp=minp
                minp=minp.leftNode
            p.data=minp.data
            p=minp
            pp=minpp
        child=None
        if(p.leftNode!=None):
            child=p.leftNode
        else:
            child=p.rightNode
        if(pp==None):
            self.root=child
        elif(pp.rightNode==p):
            pp.rightNode=child
        else:
            pp.leftNode=child

ls=[2,1,5,4,3]
tree=MyBinaryTree()
for ele in ls:
     tree.add(ele)
for ele in ls:
    print(tree.search(ele))
tree.preForeach(tree.root)
tree.delete(1)
tree.preForeach(tree.root)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值