算法基础 01

算法基础(一)

最近俩天学习了很多算法,很感兴趣 所以准备长期更新下去标题 有时会学习下英语单词 学习高数 所以日期不定
写者目的 供回忆复习使用 很多基础内容请看专业书籍记忆

很多算法 如常规算法 汉诺塔 二分查找 线性查找 冒泡排序 快速排序 创建堆 堆排 插入 插入排序 希尔排序 计数排序 基数排序 桶排序 线性二叉树排序 括号 迷宫深度搜索 迷宫广度搜索 等等不多详讲 很容易学会
下面讲一个AVL树的写法

AVL 需要了解二叉树 见 AVL树百度百科

class AVLTree(BSTTree):
    def __init__(self,li=None):
        BSTTree.__init__(self,li)
    #右右左旋
    #即 s2 属于p   p属于c
    def rotote_left(self,p,c):
        s2 =c.lchild;
        p.rchild=s2
        if s2:
            s2.parent=p
        c.lchild=p
        p.parent=c

        #更新bf

        p.bf = 0
        c.bf = 0
        return c

    def rotote_right(self,p,c):
        s2=c.rchild
        p.lchild=s2
        if s2:
            s2.parent=p
        c.rchild=p
        p.parent=c

        #更新bf

        p.bf=0
        c.bf=0
        return c
    def rotote_right_left(self,p,c):
        g=c.lchild

        s3=g.rchild
        c.lchild=s3
        if s3:
            s3.parent=c
        g.rchild =c
        c.parent=g

        s2=g.lchild
        p.rchild=s2
        if s2:
            s2.parent=p
        g.lchild=p
        p.parnent=g

        #更新bf
        if g.bf>0:
            c.bf=0
            p.bf=-1
        elif g.bf<0:
            c.bf=1
            p.bf=0
        else:
            p.bf=0
            c.bf=0
        return g
    #
    def rotote_left_right(self,p,c):
        g=c.rchild

        s2=g.lchild
        c.rchild=s2
        if s2:
            s2.parent=c

        s3=g.rchild
        p.lchild=s3
        if s3:
            s3.parent=p

        g.rchild=p
        p.parent=g
        g.lchild=c
        c.parent=g

        #更新bf
        if g.bf>0:
            p.bf=0
            c.bf=-1
        elif g.bf<0:
            p.bf=1
            c.bf=0
        else:
            p.bf=0
            c.bf=0
        return g
    def insert_no_rec(self,val):

        p = self.root  #初始为搜索二叉树树
        if not p:
            self.root = AVLNode(val)
            return
        while True:
            if val < p.data:
                if p.lchild:
                    p = p.lchild  #持续遍历
                else:
                    p.lchild = AVLNode(val)  #符合条件创建
                    p.lchild.parent = p   #连接父节点

                    node=p.lchild  #保存生成的p
                    break
            elif val > p.data:
                if p.rchild:
                    p = p.rchild
                else:
                    p.rchild = AVLNode(val)
                    p.rchild.parent = p
                    node=p.lchild  #保存生成的p
                    break
            else:
                return  #不允许插入相同的值
        #接下来循环遍历
        print("进入")
        self.mid_order(self.root)
        while node.parent:
            if node.parent.lchild==node: #判断是从哪个树插入的  左边  即有 左左 (右旋)  左右 (左旋右旋)
                g = node.parent.parent
                primitiveNode = node.parent
                if node.parent.bf<0:
                    if node.bf>0:
                        n=self.rotote_left_right(node.parent,node)
                        break
                    else:
                        n=self.rotote_right(node.parent,node)
                elif node.parent.bf>0:
                    node.parent.bf=0
                    break
                else:
                    node.parent.bf=-1
                    node=node.parent
                    continue
            else:
                if node.parent.bf>0:
                    g = node.parent.parent
                    primitiveNode = node.parent
                    if node.bf>0:
                        n=self.rotote_left(node.parent,node)
                    else:
                        n=self.rotote_right_left(node.parent,node)
                elif node.parent.bf<0:
                    node.parent.bf=0
                    break
                else:
                    node.parent.bf=1
                    node=node.parent
                    continue
            n.parent=g
            if not g:
                self.root=n
                return
            if g.lchild==primitiveNode:
                g.lchild=node
                break
            else:
                g.rchild=node
                break

大致的内容:
AVL树插入 搜索树的插入规则 结合 左旋 右旋 左右旋 右左旋
形成
bf是AVL树重要表现形式 我们可以自定义balanced factor bf 如 右树每有一层为正数 左树每有一层为负数 相加即为bf
只要是AVL树 其balanced factor总是不大于1 或者小于-1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值