python AVLTree

原创 2015年07月11日 10:28:21

http://blog.csdn.net/l153097889/article/details/46774725

http://blog.csdn.net/l153097889/article/details/46839823

#-------------------------------------------------------------------------------
# Name:        BinarySearchTree
# Purpose:     平衡二叉搜索树
#
# Author:      M.E.Liu
#
# Created:     12/07/2015
# Copyright:   (c) M.E.Liu 2015
# Licence:     <Artificial Intelligence Lab of HUST>
#-------------------------------------------------------------------------------

import BinarySearchTree as BST
import BinaryTree as BT

class AVLTreeNode(BT.BinaryTreeNode):
    __slots__ = {'data','left','right','height'}

    def __init__(self,data=0,left=0,right=0,height=0):
        BT.BinaryTreeNode.__init__(self,data,left,right)
        self.height = height

class AVLTree(BST.BinarySearchTree):

    def leftRotate(self,treenode):#左旋
        node = treenode.right
        treenode.right = node.left
        node.left = treenode
        node.height = self.getHeight(node)
        treenode.height = self.getHeight(treenode)
        return node

    def left2RightRotate(self,treenode):#先左旋再右旋
        node= treenode.left
        treenode.left = self.leftRotate(node)
        return self.rightRotate(treenode)

    def rightRotate(self,treenode):#右旋
        node = treenode.left
        treenode.left = node.right
        node.right = treenode
        node.height = self.getHeight(node)
        treenode.height = self.getHeight(treenode)
        return node

    def right2LeftRotate(self,treenode):#先右旋再左旋
        node= treenode.right
        treenode.right = self.rightRotate(node)
        return self.leftRotate(treenode)

    def insert(self,data):
            self.root = self.insertNode(self.root,data)

    def insertNode(self,treenode,data):
        if not treenode:
            node = AVLTreeNode(data=data)
            node.height = self.getHeight(node)
            return node
        direction = 0 if treenode.data > data else 1
        treenode[direction] = self.insertNode(treenode[direction],data)
        leftHeight = 0 if not treenode.left else self.getHeight(treenode.left)
        rightHeight = 0 if not treenode.right else self.getHeight(treenode.right)
        if not leftHeight-rightHeight<2:
            node = treenode.left
            #**************左左:直接右旋******************************************************************左右:先左旋再右旋****
            return self.rightRotate(treenode) if self.getHeight(node.left) > self.getHeight(node.left) else self.left2RightRotate(treenode)
        elif not rightHeight-leftHeight<2:
            node = treenode.right
            #*************右右:直接左旋*******************************************************************右左:先右旋再左旋****
            return self.leftRotate(treenode) if self.getHeight(node.right) > self.getHeight(node.left) else self.right2LeftRotate(treenode)
        else:
            return treenode


    def delNode(self,treenode,data):
        if not treenode.left and not treenode.right:
            return 'leaf'
        if treenode.data is data:
            if treenode.left and treenode.right:
                rightnode = treenode.right
                rightparent = rightnode
                while rightnode.left:
                    rightparent = rightnode
                    rightnode = rightnode.left
                treenode.data = rightnode.data
                if self.delNode(rightnode,rightnode.data) is 'leaf':
                    rightparent.left = None
            else:
                direction = 0 if treenode.left else 1
                treenode.data = treenode[direction].data
                if self.delNode(treenode[direction],data) is 'leaf':
                    treenode[direction] = None
        else:
            parent = treenode
            direction = 0 if treenode.data >data else 1
            treenode = parent[direction]
            if self.delNode(treenode,data) is 'leaf':
                parent[direction] = None

        leftHeight = 0 if not treenode.left else self.getHeight(treenode.left)
        rightHeight = 0 if not treenode.right else self.getHeight(treenode.right)
        if not leftHeight-rightHeight<2:
            node = treenode.left
            #**************左左:直接右旋******************************************************************左右:先左旋再右旋****
            self.rightRotate(treenode) if self.getHeight(node.left) > self.getHeight(node.left) else self.left2RightRotate(treenode)
            return 'node'
        elif not rightHeight-leftHeight<2:
            node = treenode.right
            #*************右右:直接左旋*******************************************************************右左:先右旋再左旋****
            self.leftRotate(treenode) if self.getHeight(node.right) > self.getHeight(node.left) else self.right2LeftRotate(treenode)
            return 'node'
        else:
            return 'node'


def main():
    bt = AVLTree()
    n8 = AVLTreeNode(8,0,0)
    n6 = AVLTreeNode(6,0,0)
    n15 = AVLTreeNode(15,0,0)
    n13 = AVLTreeNode(13,0,0)
    n11 = AVLTreeNode(11,0,0)
    n9 = AVLTreeNode(9,0,0)
    n5 = AVLTreeNode(5,0,n6)
    n3 = AVLTreeNode(3,0,0)
    n1 = AVLTreeNode(1,0,0)

    n7 = AVLTreeNode(7,n5,n8)
    n14 = AVLTreeNode(14,n13,n15)
    n10 = AVLTreeNode(10,0,n11)
    n12 = AVLTreeNode(12,n10,n14)
    n2 = AVLTreeNode(2,n1,n3)
    n4 = AVLTreeNode(4,n2,n7)
    n9 = AVLTreeNode(9,n4,n12)

    bt.root = n9

    bt.delNode(bt.root,12)
    bt.midOrder(bt.root)

##    for i in range(1,16):
##        exec("node = bt.findNode(bt.root,"+str(i)+")")
##        print str(i)+':'+str(node.height)

    pass

if __name__ == '__main__':
    main()



AvlTree的实现,包含删除方法

参考数据结构与算法 Java语言描述 实现平衡二叉树 思想主要是节点保存高度信息, 在remove和insert递归返回过程中检查是否破坏平衡然后通过单旋转或双旋转重新平衡 实现代码如下: publi...
  • xmh20080170
  • xmh20080170
  • 2017年12月06日 01:17
  • 23

平衡二叉树的调整模版

模版
  • xinag578
  • xinag578
  • 2015年07月01日 19:58
  • 518

平衡二叉树 之 AVL树

AVL树的数据结构以及插入和删除操作实现...
  • whucyl
  • whucyl
  • 2013年12月12日 22:22
  • 20584

数据结构和算法------AVLTree的实现

在实现AVLTree之前,首先应该明确: 1. AVLTree是一种特殊的BinarySearchTree,即带有平衡条件的二叉查找树.所以BinarySearchTree的部分操作在此处可以套用....
  • sinat_33661267
  • sinat_33661267
  • 2016年11月27日 21:17
  • 386

支持泛型AVL Tree的简单实现,并和STL map比较了插入,删除,查找的性能

1.问题描述:    1)AVL tree是一种自平衡树。它通过左右子树的高度差来控制树的平衡,当高度差是不大于1的时候,认为树是平衡的。树的平衡保证了树在极端情况下          (...
  • weiyuefei
  • weiyuefei
  • 2016年07月27日 18:12
  • 417

算法--AVL树的删除

AVL 树删除 定义 AVL树是一棵二叉查找树,平衡因子为-1,1,0.若平衡因子为2就必须进行平衡化。平衡化的过程就是左旋或者右旋,分LL,LR,RR,RL4种情况。 性能: 高度为:log...
  • tang_jin2015
  • tang_jin2015
  • 2013年02月27日 03:42
  • 1005

AVLTree的实现

AVLTRee树 AVLTree的性质:                1.左子树和右子树的高度之差的绝对值不超过1                2.树中的每个左子树和右子树都是AVL树     ...
  • csdnldsg
  • csdnldsg
  • 2016年07月05日 13:57
  • 143

剑指offer(41):判断二叉树是否为平衡二叉树(AVL树)

题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。分析平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的...
  • u011080472
  • u011080472
  • 2016年04月27日 21:02
  • 305

[sicily]部分题目分类

*************************程序设计题************************* sicily 1293, uva 100, pc 110101, 3n+1数链问题, 难...
  • luohuang0423
  • luohuang0423
  • 2015年09月24日 11:20
  • 777

平衡二叉树_AVLTree

DataStruct :   平衡二叉树的出现是为了解决类似用序列{1,2,3,4,……}\{1,2,3,4,……\}来构造二叉排序树而出现的树高过高,树高过高会导致查询的时间变大。最理想的二叉排...
  • FlushHip
  • FlushHip
  • 2016年11月06日 17:33
  • 296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python AVLTree
举报原因:
原因补充:

(最多只允许输入30个字)