AVLTree

来源:互联网 发布:淘宝店铺直通车 编辑:程序博客网 时间:2024/04/27 15:36



class MutableAVLTreeMapclass Nodedef self.height nodenode ? node.height : 0enddef self.insert node, key, value if node.nil?new key, value, nil, nilelsecase key<=>node.key when -1node.left = insert node.left, key, valuebalance nodewhen 0node.value = valuenodewhen 1node.right = insert node.right, key, valuebalance nodeelsefailendendenddef self.remove node, keyif node.nil?nilelsecase key<=>node.keywhen -1node.left = remove node.left, keybalance nodewhen 0case nilwhen node.leftnode.rightwhen node.rightnode.left else ptr = node.leftwhile ptrif ptr.rightptr = ptr.rightelsebreakendendnode.key = ptr.keynode.value = ptr.valuenode.left = remove node.left, ptr.keybalance nodeendwhen 1node.right = remove node.right, keybalance nodeelsenodeendendenddef self.balance nodecase height(node.right)-height(node.left)when -2left = node.leftif height(left.right)>height(left.left)node.left = left.rotate_leftendnode.rotate_rightwhen 2right = node.right if height(right.left)>height(right.right)node.right = right.rotate_rightendnode.rotate_leftelsenode.update!nodeendendattr_accessor :key, :value, :left, :right, :heightdef initialize key, value, left, right@key = key @value = value@height = 0@left = @left@right = @rightupdate!enddef update!h = ->(x){ x ? [h[x.left],h[x.right]].max+1 : 0 }@height = [Node.height(@left),Node.height(@right)].max.succ    raise unless h[self]==@heightenddef rotate_leftnode = @right@right = node.leftnode.left = selfself.update!node.update!nodeenddef rotate_rightnode = @left @left = node.rightnode.right = selfself.update!node.update!nodeendenddef initialize@root = nilenddef [] key node = @rootwhile nodecase key<=>node.keywhen -1node = node.leftwhen 0return node.valuewhen 1node = node.rightelsereturn nilendendenddef []= key, value@root = Node.insert @root, key, valueenddef delete key@root = Node.remove @root, keyenddef sizef = ->(x){x ? f[x.left]+f[x.right]+1 : 0}f[@root]enddef check node=@root if node.leftcheck node.leftendif node.right check node.right endx = Node.height(node.left)-Node.height(node.right)if not [-1,0,1].include?(x)raise 'fail'endh = ->(x){ x ? [h[x.left],h[x.right]].max+1 : 0 }fail unless h[node]==node.heightendend


class ImmutableAVLTreeMapprivateclass Nodeattr_reader :key, :value, :left, :right, :heightdef initialize key, value, left, right @key = key @value = value@left = left @right = right @height = [Node.height(left),Node.height(right)].max.succenddef self.balance key, value, left, rightcase height(left)-height(right)when -2if height(right.left)<=height(right.right)new_left = new key, value, left, right.leftnew right.key, right.value, new_left, right.rightelseright_left = right.leftnew_left = new key, value, left, right_left.left new_right = new right.key, right.value, right_left.right, right.rightnew right_left.key, right_left.value, new_left, new_rightendwhen 2if height(left.left)>=height(left.right)new_right = new key, value, left.right, rightnew left.key, left.value, left.left, new_rightelseleft_right = left.rightnew_left = new left.key, left.value, left.left,left_right.left new_right = new key, value, left_right.right, rightnew left_right.key, left_right.value, new_left, new_right endelsenew key, value, left, right endenddef self.insert node, key, valueif node.nil?new key, value, nil, nilelsecase key <=> node.keywhen -1new_left = insert node.left, key, valuebalance node.key, node.value , new_left, node.right when 0new key, value, node.left, node.rightwhen 1new_right = insert node.right, key, valuebalance node.key, node.value, node.left, new_rightelsefailendendenddef self.height nodenode ? node.height : 0enddef head if @left.nil?Node.new @key, @value, nil, nilelse@left.headendenddef tail if @left.nil?rightelsenew_left = @left.tail Node.balance @key, @value, new_left, @right  endenddef self.merge x, ycase when x.nil?y when y.nil?x elsenode = y.headbalance node.key, node.value, x, y.tailendenddef self.remove node, key if node.nil?nil elsecase key<=>node.key when -1new_left = remove node.left, keybalance node.key, node.value, new_left, node.rightwhen 0merge node.left, node.rightwhen 1new_right = remove node.right, keybalance node.key, node.value, node.left, new_rightelsenodeendendendenddef initialize node@root = nodeendpublicdef self.empty@@empty ||= new nilenddef get keynode = @root while node case key<=>node.keywhen -1node = node.left when 0return node.value when 1node = node.right elsereturn nilendendenddef put key, value self.class.new Node.insert @root, key, valueenddef del keyself.class.new Node.remove @root, key enddef eachf = ->(x){if x thenf[x.left]yield [x.key,x.value]f[x.right]end}f[@root]endend



0 0