日韩性视频-久久久蜜桃-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)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 亚洲xx网 | 久草中文在线观看 | 日本sm调教—视频|vk | 女人天堂网 | www污网站 | 国产乱色 | 亚洲a网| 岛国av中文字幕 | 日本午夜小视频 | 中文字幕免费中文 | 少妇高潮av| 日本一区二区在线免费 | 天堂成人av | 偷拍老头老太高潮抽搐 | 国产精品日韩欧美一区二区三区 | 中文字幕美女 | 日韩av手机在线免费观看 | 日日骑 | 国产欧美一区二区精品性色超碰 | 国产视频123 | 欧美片| 91免费成人 | 99久久婷婷国产综合精品电影 | 中文字幕一区二区人妻痴汉电车 | 妹子色综合 | 日韩精品成人无码专区免费 | 日本在线视频www | 欧美日韩aaa | 亚洲高清影院 | 国产首页 | 精品国产无码一区二区三区 | 中文字幕第23页 | 国产伦精品一区二区三区高清版 | 国产1区 | 污漫网站| 另类视频在线观看+1080p | 特级西西444www | 干欧美少妇 | 国产精品亚洲一区二区三区 | 韩日黄色| 日日狠狠久久偷偷四色综合免费 | 国产中文在线视频 | 国产精品扒开腿做爽爽爽视频 | 国产一区导航 | 巨物撞击尤物少妇呻吟 | 免费看爱爱视频 | 色图18p | china国模大尺度pics | 一区二区免费播放 | 精品在线播放视频 | 视频污在线观看 | 老熟妇午夜毛片一区二区三区 | 久久久久亚洲av成人网人人网站 | 九九99久久 | 少妇全黄性生交片 | 免费av福利 | 国产精品探花一区二区在线观看 | 亚洲人xxx日本人18 | 黄色av网站在线 | 国产第6页 | 国产精品久久久久久久成人午夜 | 九一国产视频 | 国产盗摄一区二区 | 精品一区中文字幕 | 浪潮av色 | 五月激情av | 中文在线不卡 | 免费观看成人 | 日本学生初尝黑人巨免费视频 | 国产精品久久久久永久免费看 | 妖精视频在线观看 | 69av一区二区三区 | 在线观看成人小视频 | 天天草视频 | 日韩av无码中文字幕 | 国产人妖视频 | 黄床大片 | 91插插插永久免费 | 国产美女在线免费观看 | 国产在线精品视频 | 天天射天天射天天射 | 国产探花一区二区三区 | exo妈妈mv在线播放高清免费 | 一区二区三区国产在线观看 | 亚洲午夜剧场 | 日韩成人在线观看视频 | 国产激情一区二区三区四区 | 美国色综合 | 日韩av一区在线观看 | 国产一级在线免费观看 | 人人综合网 | 夜夜狠| 卡一卡二av | 男操女视频在线观看 | 亚洲精品777 | 国产精品久久视频 | 超碰av男人的天堂 | 国产精品无码久久久久成人app | 97超碰人人看 |