老熟女激烈的高潮_日韩一级黄色录像_亚洲1区2区3区视频_精品少妇一区二区三区在线播放_国产欧美日产久久_午夜福利精品导航凹凸

重慶分公司,新征程啟航

為企業提供網站建設、域名注冊、服務器等服務

計算機網絡中紅黑樹插入的示例分析-創新互聯

這篇文章主要介紹計算機網絡中紅黑樹插入的示例分析,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

岱山ssl適用于網站、小程序/APP、API接口等需要進行數據傳輸應用場景,ssl證書未來市場廣闊!成為創新互聯的ssl證書銷售渠道,可以享受市場價格4-6折優惠!如果有意向歡迎電話聯系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!

紅黑樹的性質

一棵滿足以下性質的二叉搜索樹是一棵紅黑樹

  1. 每個結點或是黑色或是紅色。

  2. 根結點是黑色的。

  3. 每個葉結點(NIL)是黑色的。

  4. 如果一個結點是紅色的,則它的兩個子結點都是黑色的。

  5. 對每個結點,從該結點到其所有后代葉結點的簡單路徑上,均包含相同數目的黑色結點。

性質1和性質2,不用做過多解釋。

計算機網絡中紅黑樹插入的示例分析

性質3,每個葉結點(NIL)是黑色的。這里的葉結點并不是指上圖中結點1,5,8,15,而是指下圖中值為null的結點,它們的顏色為黑色,且是它們父結點的子結點。

計算機網絡中紅黑樹插入的示例分析

性質4,如果一個結點是紅色的(圖中用白色代替紅色),則它的兩個子結點都是黑色的,例如結點2,5,8,15。但是,如果某結點的兩個子結點都是黑色的,該結點未必是紅色的,例如結點1。

性質5,對每個結點,從該結點到其所有后代葉結點的簡單路徑上,均包含相同數目的黑色結點。例如,從結點2到其所有后代葉結點的簡單路徑上,黑色結點的數量都為2;從根結點11到其所有后代葉結點的簡單路徑上,黑色結點的數量都為3。

這樣的一棵樹有什么特點呢?

通過對任何一條從根到葉結點的簡單路徑上各個結點的顏色進行約束,紅黑樹確保沒有一條路徑會比其他路徑長出2倍,因為是近似于平衡的。——《算法導論》

由于性質4,紅黑樹中不會出現兩個紅色結點相鄰的情形。樹中最短的可能出現的路徑是都是黑色結點的路徑,樹中最長的可能出現的路徑是紅色結點和黑色結點交替的路徑。再結合性質5,每條路徑上均包含相同數目的黑色結點,所以紅黑樹確保沒有一條路徑會比其他路徑長出2倍。

紅黑樹的插入

首先以二叉搜索樹的方式插入結點,并將其著為紅色。如果著為黑色,則會違背性質5,不便調整;如果著為紅色,可能會違背性質2或性質4,可以通過相對簡單的操作,使其恢復紅黑樹的性質。

一個結點以二叉搜索樹的方式被插入后,可能出現以下幾種情況:

情形1

插入結點后,無父結點,結點插入成為根結點,違背性質2,將結點調整為黑色,完成插入。

情形2

插入結點后,其父結點為黑色,沒有違背任何性質,不用調整,完成插入。例如下圖中插入結點13。

計算機網絡中紅黑樹插入的示例分析

情形3

插入結點后,其父結點為紅色,違背了性質4,需要采取一系列的調整。例如下圖中插入結點4。

計算機網絡中紅黑樹插入的示例分析

那么一系列的調整是什么呢?

如果插入結點node的父結點father為紅色,則結點father必然存在黑色的父結點grandfather,因為如果結點father不存在父結點的話,就是根結點,而根結點是黑色的。那么結點grandfather的另一個子結點,我們可以稱之為結點uncle,即結點father的兄弟結點。結點uncle可能為黑色,也可能為紅色。

先從最簡單的情形分析,因為復雜的情形可以轉化為簡單的情形,簡單的情形就是結點uncle為黑色的情形。

計算機網絡中紅黑樹插入的示例分析

情形3.1

如上圖(a)中,情形是這樣的,node 為紅,father 為紅,grandfather 和 uncle 為黑,α,β,θ,ω,η 都是結點對應的子樹。假設整棵二叉搜索樹中,只有node和father因違背性質4而無法成為正常的紅黑樹,此時將圖(a)調整成圖(b),則可以恢復成正常的紅黑樹。整個調整過程中實際分為兩步,旋轉和變色。

什么是旋轉?

計算機網絡中紅黑樹插入的示例分析

如上圖(c)是一棵二叉搜索樹的一部分,其中 x, y 是結點,α,β,θ 是對應結點的子樹。由圖可知,α < x < β < y < θ ,即 α子樹中的所有結點都小于x,結點 x都小于 β子樹中的所有結點,β子樹中的所有結點的值都小于結點 y 的值,結點 y 的值都小于 θ子樹中的所有結點。在二叉搜索樹中,如果結點y的值比結點x的值大,那么結點x在結點y的左子樹中,如圖(c);或者結點y在結點x的右子樹中,如圖(d)。故 α < x < β < y < θ ,也可以用圖(d)的結構來表現。這就是旋轉,它不會破壞二叉搜索樹的性質。

node 為紅,father 為紅,grandfather 和 uncle 為黑的具體情形一

圖(a)中,node 為 father 的左子結點, father 為 grand 的左子結點,node < father < θ < grand < uncle。這種情形中 father < grand,即可以表現為 father 是 grand 的左子樹,也可以表現為 grand 是 father 的右子樹,故將圖(a)中 father 和 grand 旋轉,旋轉雖然不會破壞二叉搜索樹的性質,但是旋轉之后,會破壞紅黑樹的性質,所以還需要調整結點的顏色。

變色

所以圖(a)旋轉過后,還要將 grand 變為紅色,father 變為黑色,變成圖(b),完成插入。

node 為紅,father 為紅,grandfather 和 uncle 為黑的具體情形二

node 為 father 的右子結點, father 為 grand 的右子結點,如下圖(e),就是具體情形一的翻轉。

計算機網絡中紅黑樹插入的示例分析

即,uncle < grand < θ < father < node ,將圖(e)中 father 和 grand 旋轉,變色后,變成圖(f),完成插入。

node 為紅,father 為紅,grandfather 和 uncle 為黑的具體情形三

node 為 father 的右子結點, father 為 grand 的左子結點,如下圖(m)。

計算機網絡中紅黑樹插入的示例分析

將圖(m)中 node 和 father 旋轉后,變成圖(n),將father看作新的node,就成為了具體情形一,再次旋轉,變色后,完成插入。

node 為紅,father 為紅,grandfather 和 uncle 為黑的具體情形四

node 為 father 的右子結點, father 為 grand 的左子結點,如下圖(i),就是具體情形三的翻轉。

計算機網絡中紅黑樹插入的示例分析

將圖(i)中 node 和 father 旋轉后,變成圖(j),將father看作新的node,就成為了具體情形二,再次旋轉,變色后,完成插入。

情形3.2

node ,father 和 uncle 為紅,grandfather 為黑。

計算機網絡中紅黑樹插入的示例分析

如上圖(k),不旋轉,而是將grand著紅,father和uncle著黑,同時將grand作為新的node,進行情形的判斷。如果grand作為新的node后,變成了情形2,則插入完成;如果變成了情形3.1,則調整后,插入完成;如果仍是情形3.2,則繼續將grand,father和uncle變色,和node結點上移,如果新的node結點沒有父節點了,則變成了情形1,將根結點著為黑色,那么插入完成。

綜上


node的情形操作
情形1node為紅,無father將node重新著色
情形2node為紅,father為黑
情形3.1node,father為紅,grand,uncle為黑旋轉一次或兩次,并重新著色
情形3.2node,father,uncle為紅,grand為黑將father, uncle,grand重新著色, grand作為新的node

代碼

// 結點
function Node(value) {
 this.value = value
 this.color = 'red' // 結點的顏色默認為紅色
 this.parent = null
 this.left = null
 this.right = null
}

function RedBlackTree() {
 this.root = null
}

RedBlackTree.prototype.insert = function (node) {
 // 以二叉搜索樹的方式插入結點
 // 如果根結點不存在,則結點作為根結點
 // 如果結點的值小于node,且結點的右子結點不存在,跳出循環
 // 如果結點的值大于等于node,且結點的左子結點不存在,跳出循環
 if (!this.root) {
 this.root = node
 } else {
 let current = this.root
 while (current[node.value <= current.value ? 'left' : 'right']) {
  current = current[node.value <= current.value ? 'left' : 'right']
 }
 current[node.value <= current.value ? 'left' : 'right'] = node
 node.parent = current
 }
 // 判斷情形
 this._fixTree(node)
 return this
}

RedBlackTree.prototype._fixTree = function (node) {
 // 當node.parent不存在時,即為情形1,跳出循環
 // 當node.parent.color === 'black'時,即為情形2,跳出循環
 while (node.parent && node.parent.color !== 'black') {
 // 情形3
 let father = node.parent
 let grand = father.parent
 let uncle = grand[grand.left === father ? 'right' : 'left']
 if (!uncle || uncle.color === 'black') {
  // 葉結點也是黑色的
  // 情形3.1
  let directionFromFatherToNode = father.left === node ? 'left' : 'right'
  let directionFromGrandToFather = grand.left === father ? 'left' : 'right'
  if (directionFromFatherToNode === directionFromGrandToFather) {
  // 具體情形一或二
  // 旋轉
  this._rotate(father)
  // 變色
  father.color = 'black'
  grand.color = 'red'
  } else {
  // 具體情形三或四
  // 旋轉
  this._rotate(node)
  this._rotate(node)
  // 變色
  node.color = 'black'
  grand.color = 'red'
  }
  break // 完成插入,跳出循環
 } else {
  // 情形3.2
  // 變色
  grand.color = 'red'
  father.color = 'black'
  uncle.color = 'black'
  // 將grand設為新的node
  node = grand
 }
 }

 if (!node.parent) {
 // 如果是情形1
 node.color = 'black'
 this.root = node
 }
}

RedBlackTree.prototype._rotate = function (node) {
 // 旋轉 node 和 node.parent
 let y = node.parent
 if (y.right === node) {
 if (y.parent) {
  y.parent[y.parent.left === y ? 'left' : 'right'] = node
 }
 node.parent = y.parent
 if (node.left) {
  node.left.parent = y
 }
 y.right = node.left
 node.left = y
 y.parent = node
 } else {
 if (y.parent) {
  y.parent[y.parent.left === y ? 'left' : 'right'] = node
 }
 node.parent = y.parent
 if (node.right) {
  node.right.parent = y
 }
 y.left = node.right
 node.right = y
 y.parent = node
 }
}

let arr = [11, 2, 14, 1, 7, 15, 5, 8, 4, 16]
let tree = new RedBlackTree()
arr.forEach(i => tree.insert(new Node(i)))
debugger

以上是“計算機網絡中紅黑樹插入的示例分析”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注創新互聯成都網站設計公司行業資訊頻道!

另外有需要云服務器可以了解下創新互聯scvps.cn,海內外云服務器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務器、裸金屬服務器、高防服務器、香港服務器、美國服務器、虛擬主機、免備案服務器”等云主機租用服務以及企業上云的綜合解決方案,具有“安全穩定、簡單易用、服務可用性高、性價比高”等特點與優勢,專為企業上云打造定制,能夠滿足用戶豐富、多元化的應用場景需求。


分享文章:計算機網絡中紅黑樹插入的示例分析-創新互聯
分享路徑:http://www.xueling.net.cn/article/dophes.html

其他資訊

在線咨詢
服務熱線
服務熱線:028-86922220
TOP
主站蜘蛛池模板: 亚洲国产另类久久精品 | 日韩av在线第一页 | 久久偷看各类WC女厕嘘嘘 | x8x8拨牐拨牐x8免费视频8午夜 | 熟妇人妻无乱码中文字幕 | 青青草护士中出内射 | 在线观看亚洲AV日韩A∨ | 国产在线视频欧美一区 | 欧美自拍亚洲综合丝袜 | 国产一区二区女 | 亚洲乱码一区二区三区在线观看 | 国产乱了伦视频大全亚琴影院 | 久久久久久综合岛国免费观看 | 亚洲人a成www在线影院 | 成人91av| 四虎成人精品在永久在线 | 国产成社区在线视频观看 | 久久亚州 | 日韩精品久久久久久久九岛 | 大陆国语对白国产av片 | 小嫩妇好紧好爽再快视频 | 成人性生交大片免费看中文带字幕 | 久久网精品三级片 | 亚洲三级在线观看 | 久久久久人妻精品 | 无码无套少妇毛多18PXXXX | 香港a毛片免费全部播放 | 国产91视频网 | 秋霞鲁丝片无码av | 国产乱子夫妻XX黑人XYX真爽 | 91久久精品综合 | 精品久久久久久无码免费 | 九色精品91 | 日本一级特黄毛片高清视频 | 人人爱人人做 | 国产一级片av | 黑人巨大精品欧美 | 亚洲ΑV无码一区二区三区四区 | 黄色7777| 高H猛烈失禁潮喷A片在线观看 | 日本美女视频有色 |