Левосторонние красно-чёрные деревья — различия между версиями
(→Удаление) |
(→Удаление) |
||
| Строка 84: | Строка 84: | ||
<code> | <code> | ||
'''Node''' deleteMin( h : '''Node'''): | '''Node''' deleteMin( h : '''Node'''): | ||
| − | '''if''' h.left == null | + | '''if''' h.left == ''null'' |
| − | '''return''' null | + | '''return''' ''null'' |
'''if''' !isRed(h.left) '''&&''' !isRed(h.left.left) | '''if''' !isRed(h.left) '''&&''' !isRed(h.left.left) | ||
h = moveRedLeft(h) | h = moveRedLeft(h) | ||
| Строка 103: | Строка 103: | ||
<code> | <code> | ||
| − | ''' | + | '''Node''' moveRedRight(h :'''Node''' ): |
colorFlip(h) | colorFlip(h) | ||
'''if''' isRed(h.left.left)) | '''if''' isRed(h.left.left)) | ||
| Строка 126: | Строка 126: | ||
h = rotateRight(h) | h = rotateRight(h) | ||
'''if''' key.compareTo(h.key) == 0 '''&&''' (h.right == null) | '''if''' key.compareTo(h.key) == 0 '''&&''' (h.right == null) | ||
| − | '''return''' null | + | '''return''' ''null'' |
| − | '''if''' !isRed(h.right) && !isRed(h.right.left) | + | '''if''' !isRed(h.right) '''&&''' !isRed(h.right.left) |
h = moveRedRight(h) | h = moveRedRight(h) | ||
'''if''' key.compareTo(h.key) == 0 | '''if''' key.compareTo(h.key) == 0 | ||
Версия 02:48, 8 декабря 2017
Определение
|definition = Left-leaning Red-Black Trees .
Вращения
Node rotateRight(h : Node): x = h.left h.left= x.right x.right= h x.color = h.color h.color = RED return x
Node rotateLeft(h : Node): x = h.right h.right = x.left x.left = h x.color = h.color h.color = RED return x
void flipColors(h : Node h): h.color = !h.color h.left.color = !h.left.color h.right.color = !h.right.color
Методы
void insert( key : Key, value : Value ):
root = insert(root, key, value)
root.color = BLACK
Node insert( h : Node, key : Key, value : Value):
if h == null
return new Node(key, value)
if isRed(h.left) && isRed(h.right)
colorFlip(h)
int cmp = key.compareTo(h.key)
if cmp == 0
h.val = value
else
if cmp < 0
h.left = insert(h.left, key, value)
else
h.right = insert(h.right, key, value)
if isRed(h.right) && !isRed(h.left)
h = rotateLeft(h)
if isRed(h.left) && isRed(h.left.left)
h = rotateRight(h)
return h
Value search(key : Key):
Node x = root
while x != null
int cmp = key.compareTo(x.key)
if cmp == 0
return x.val
else
if cmp < 0
x = x.left
else
if cmp > 0
x = x.right
return null
Удаление
void deleteMin(): root = deleteMin(root) root.color = BLACK
Node deleteMin( h : Node):
if h.left == null
return null
if !isRed(h.left) && !isRed(h.left.left)
h = moveRedLeft(h)
h.left = deleteMin(h.left)
return fixUp(h)
Node moveRedLeft(Node h):
colorFlip(h):
if isRed(h.right.left)
h.right = rotateRight(h.right)
h = rotateLeft(h)
colorFlip(h)
return h
Node moveRedRight(h :Node ):
colorFlip(h)
if isRed(h.left.left))
h = rotateRight(h)
colorFlip(h)
return h
void delete(key : Key): root = delete(root, key) root.color = BLACK
Node delete(Node : h, Key : key):
if key.compareTo(h.key) < 0)
if !isRed(h.left) && !isRed(h.left.left)
h = moveRedLeft(h)
h.left = delete(h.left, key)
else
if isRed(h.left)
h = rotateRight(h)
if key.compareTo(h.key) == 0 && (h.right == null)
return null
if !isRed(h.right) && !isRed(h.right.left)
h = moveRedRight(h)
if key.compareTo(h.key) == 0
h.val = get(h.right, min(h.right).key)
h.key = min(h.right).key
h.right = deleteMin(h.right)
else
h.right = delete(h.right, key)
return fixUp(h)