日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

数据结构之平衡树:红黑树的介绍与Python代码实现——17

發(fā)布時間:2024/7/5 python 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构之平衡树:红黑树的介绍与Python代码实现——17 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

紅黑樹的介紹與Python代碼實現(xiàn)

紅黑樹的介紹

  • 紅黑樹(Red-Black Tree)是一種平衡二叉查找樹,它是一種以比較簡單的方式實現(xiàn)的2-3查找樹

紅黑樹基于2-3查找樹的表現(xiàn)

  • 紅鏈接:將兩個2-結(jié)點連接起來構(gòu)成一個3-結(jié)點 ;
  • 黑鏈接:則是2-3樹中的普通鏈接。

紅黑樹的定義:
紅黑樹是含有紅黑鏈接并滿足下列條件的二叉查找樹: .

  • 紅鏈接均為左鏈接;
  • 沒有任何一個結(jié)點同時和兩條紅鏈接相連;
  • 該樹是完美色平衡的,即任意空鏈接到根結(jié)點的路徑上的黑鏈接數(shù)量相同;
  • 紅黑樹的優(yōu)點:

    • 一顆二叉樹,每一個結(jié)點只需要額外多一位空間即可實現(xiàn)紅黑樹,這一位空間通常用于存放和表示紅黑結(jié)點,而這些紅黑標(biāo)識則可以用來使紅黑樹保持接近平衡的狀態(tài)
    • 記錄每一個結(jié)點的紅黑狀態(tài),只需要額外的一位空間,這使得紅黑樹的儲存空間大小在一定程度上可以認(rèn)為和無顏色標(biāo)記的二叉樹的儲存空間大小等同,在大多數(shù)情況下,無需額外的儲存成本就能儲存著一位的紅黑記錄信息
    • 紅黑樹不是完美的平衡二叉樹,但是它的平衡狀態(tài)足夠讓我們能很方便地進(jìn)行搜尋操作,紅黑樹的查詢、插入、刪除操作時間復(fù)雜度都是O(log n)

    紅黑樹的平衡化

    為什么需要平衡化?

    • 在對紅黑樹進(jìn)行一些增刪改查的操作后 ,很有可能會出現(xiàn)紅色的右鏈接或者兩條連續(xù)紅色的鏈接,而這些都不滿足紅黑樹的定義,所以我們需要對這些情況通過旋轉(zhuǎn)進(jìn)行修復(fù),讓紅黑樹保持平衡。

    平衡化的方法

  • 左旋
  • 右旋
  • 左旋

    時機(jī):

    • 當(dāng)某個結(jié)點的左子結(jié)點為黑色,右子結(jié)點為紅色,此時需要左旋。

    實現(xiàn)方式:

    • 當(dāng)前節(jié)點為h,它的右節(jié)點是x;
      color的值是由父結(jié)點指過來的線的顏色

    實現(xiàn)過程:

    右旋

    時機(jī):

    • 當(dāng)某個結(jié)點的左子結(jié)點是紅色,并且左子結(jié)點的左子結(jié)點也是紅色,要右旋

    實現(xiàn)方式

    • 前提:當(dāng)前結(jié)點為h ,它的左子結(jié)點為x ;
      color的值由父結(jié)點指過來的線的顏色

      實現(xiàn)過程:

      右旋之后保持了有序性;但是紅鏈接連接了三個結(jié)點不滿足2-3樹的性質(zhì),同時違背了紅黑樹右鏈接不能為紅鏈接的要求,這個問題下面將會介紹使用顏色反轉(zhuǎn)的方法來解決

    平衡步驟

  • 向單個2-結(jié)點中插入新鍵后,結(jié)果是插入到該結(jié)點的右子結(jié)點,則需要進(jìn)行左旋:

    將c結(jié)點替換b(使b=c),b的顏色變?yōu)榧t,然后讓b稱為c的左子節(jié)點即可完成左旋(根結(jié)點的顏色后面會有一個操作讓其始終保持黑色)
  • 向底部的2-結(jié)點插入新鍵

    情況同一,只是需要多一步,左旋之后,C的顏色要變?yōu)楹谏?#xff08;表示指向C的邊為紅色)
  • 顏色反轉(zhuǎn)

    當(dāng)一個結(jié)點的左子結(jié)點和右子結(jié)點的color都為RED時, 也就是出現(xiàn)了臨時的4-結(jié)點,此時只需要把左子結(jié)點和右子結(jié)點的顏色變?yōu)锽LACK ,同時讓當(dāng)前結(jié)點的顏色變?yōu)镽ED即可。
  • 向一棵雙鍵樹(即一個3-結(jié)點)中插入新鍵
    可分為三種子情況
    4-1. 新鍵大于原樹中的兩個鍵:

    4-2. 新鍵小于原樹中的兩個鍵

    4-3. 新鍵介于原數(shù)中兩個鍵之間
  • 根結(jié)點的顏色總是黑色
    在每次放入元素的操作完成之后,將根結(jié)點的顏色變更為’Black’即可:
    self.root.color = 'Black'
  • 向樹底部的3-結(jié)點插入新鍵
  • 操作方法

  • is_red(node) 判斷傳入的結(jié)點node是否為紅色
  • rotate_left(node) 將傳入的結(jié)點進(jìn)行左旋操作
  • rotate_right(node) 將傳入的結(jié)點進(jìn)行右旋操作
  • alter_color(node) 將傳入的結(jié)點進(jìn)行顏色反轉(zhuǎn)操作
  • put(key, val) 插入一個鍵為key,值為val的元素,插入之后自動按鍵進(jìn)行排序
  • get_value(key) 根據(jù)傳入的鍵key,獲取對應(yīng)結(jié)點的值
  • Python代碼實現(xiàn)

    二叉樹結(jié)點設(shè)計

    class Node:def __init__(self, key, value):self.key = keyself.value = valueself.left = Noneself.right = Noneself.color = False

    功能實現(xiàn)

    class RedBlackTree:def __init__(self):self.root = Noneself.N = 0def size(self):return self.Ndef is_red(self, node):return str(node.color).lower() == 'red' if node else Falsedef rotate_left(self, node):"""Rotate left when the edge from the current node to its right child node is red"""# h is the current nodeh = node# x is the current node's right childx = node.righth.right = x.leftx.left = hx.color = h.colorh.color = 'Red'return xdef rotate_right(self, node):"""Rotate right when both the left edge and the left child's left edge are red"""h = nodex = node.lefth.left = x.rightx.right = hx.color = h.colorh.color = 'Red'return xdef alter_color(self, node):"""Alter a node's color"""node.color = 'Red'node.left.color = 'Black'node.right.color = 'Black'def put(self, key, val):"""Put an element into this tree"""def put_into(node, key, val):if not node:return Node(key, val)# Rank the orderif key < node.key: # Recursively to compare key with its left childnode.left = put_into(node.left, key, val)elif key > node.key:node.right = put_into(node.right, key, val)else: # Swap their the node.value with valnode.value = valreturn node# Rotation or alter colorif self.is_red(node.right) and not self.is_red(node.left):# Rotate leftself.rotate_left(node)if self.is_red(node.left) and self.is_red(node.left.left):# Rotate rightself.rotate_right(node)if self.is_red(node.left) and self.is_red(node.right):# Alter colorself.alter_color(node)self.N += 1return nodeself.root = put_into(self.root, key, val)self.root.color = 'Black'return self.rootdef get(self, key):"""Get a value according to the given key"""def get_value(node, key):if not node:returnif key < node.key:return get_value(node.left, key)elif key > node.key:return get_value(node.right, key)else:return node.valueval = get_value(self.root, key)return val

    代碼測試

    if __name__ == '__main__':RBT = RedBlackTree()RBT.put(1, 'G')RBT.put(2, 'K')RBT.put(3, 'd')RBT.put(3, 'D')for i in range(1, 4):print(RBT.get(i), end=' ')print('\n', RBT.size())print(RBT.root.color)print(RBT.root.key, RBT.root.value)print(RBT.root.right.key, RBT.root.right.value)print(RBT.root.right.right.key, RBT.root.right.right.value)

    測試結(jié)果

    G K D 5 Black 1 G 2 K 3 D

    插入的元素都按照對應(yīng)的鍵獲取到了,說明代碼沒有什么問題

    總結(jié)

    以上是生活随笔為你收集整理的数据结构之平衡树:红黑树的介绍与Python代码实现——17的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美精品免费看 | h在线观看视频 | 六月久久 | 国产精品xxxxxx | 中文字幕av解说 | 日韩视频第一页 | 欧美xxxx胸大 | 国产精品亚洲自拍 | 人人妻人人爽欧美成人一区 | 午夜精品福利一区二区三区蜜桃 | 伊人久久大香网 | 一级特黄a大片免费 | 激情综合小说 | 亚洲免费黄色 | 性一交一乱一透一a级 | 视频在线91 | 麻豆三级 | 成人av网站在线观看 | 深爱五月网| 欧美14sex性hd摘花 | 欧美成人免费观看视频 | 欧美视频免费看 | 亚洲午夜久久久久久久久红桃 | 四虎激情 | 国产成人在线视频 | 成人免费视频a | 日韩成人免费视频 | 黄色小说在线看 | 视频免费观看在线 | 亚洲图片视频在线 | 俄罗斯毛片基地 | 免费性网站| 欧美乱论| 日本一区二区三区视频免费看 | 春色网站 | 操模特| 极品探花在线播放 | 天降女子 | 国产αv| 天堂а在线中文在线新版 | 1区2区3区视频 | 久久国产精品网 | 亚洲欧美日韩高清 | 91亚洲国产成人精品一区二区三 | 亚洲永久精品在线观看 | 日韩一区二区三区精品视频 | 一区二区三区四区日韩 | 少妇高潮21p | 国产精品美女网站 | 欧美性生活在线视频 | 欧美一级大片免费看 | 波多av| 黄色av网址在线观看 | 亚洲综合色网 | 92久久| 久久久久无码国产精品不卡 | 不卡av电影在线 | 黄色网www | 亚洲视频在线一区二区 | 亚洲免费高清 | 影音先锋丝袜制服 | 中文字幕一区二区三区人妻 | 人人妻人人藻人人爽欧美一区 | 超碰一区二区 | 大肉大捧一进一出好爽视频 | 国产精品久久久久久久免费大片 | 波多野结衣免费视频观看 | 久久精品人人 | 无码免费一区二区三区免费播放 | 一级激情片 | 国产精品夜夜夜爽阿娇 | 亚洲国产综合久久 | 免费污网站在线观看 | 精品无码人妻一区二区三区品 | av电影一区二区 | 九九涩 | 婷婷国产精品 | 黄色av资源| 中文不卡在线 | www黄色com| 日本中文字幕第一页 | 久久国产精品偷 | 玩弄丰满少妇xxxxx性多毛 | 天堂а√在线中文在线鲁大师 | 国内精品视频在线观看 | √天堂| 911国产视频 | 亚洲国产精品区 | av成人在线电影 | 国产人妻精品一区二区三区不卡 | 欧美性受xxxxxx黑人xyx性爽 | 欧美成人国产精品一区二区 | 亚洲最新在线 | 99久久精品免费视频 | 在哪里看毛片 | 激情av | 亚洲高清视频一区 | 青青草污 | 日韩影院一区 |