AVL平衡二叉樹,紅黑樹原理。
阿新 • • 發佈:2018-12-22
二叉搜尋樹
插入和刪除操作必須先查詢,查詢效率代表了二叉搜尋樹中各個操作的效能
最優情況:二叉搜尋樹為完全二叉樹,比較次數Log2^N
最壞情況:二叉搜尋樹為單支樹,平均比較次數N/2
平衡二叉樹
平衡樹: AVL樹,紅黑樹
AVL樹:(二叉搜尋樹改良版)
AVL樹條件:具有二叉搜尋樹的性質,其左右子樹高度之差絕對值不超過1
若AVL樹,有N個節點,高度為OlogN,平均搜尋時間複雜度O(logN)
旋轉
每一次的插入數值之後,樹的平衡性可能被破壞,需要通過旋轉來保持平衡性
插入節點時候分四種情況,對應下面四種旋轉方法 插入方式 描述 旋轉方式 LL 在a左子樹根節點的左子樹上插入節點而破壞平衡 右旋 RR 在a右子樹根節點的右子樹上插入節點而破壞平衡 左旋 LR 在a左子樹根節點的右子樹上插入節點而破壞平衡 左右雙旋 RL 在a右子樹根節點的左子樹上插入節點而破壞平衡 右左雙旋
具體旋轉方法及實現參考:
原文地址:http://blog.csdn.net/qq_25806863/article/details/74755131
紅黑樹:(二叉搜尋樹改良版)
紅黑樹特性:
1 每個節點只有兩種顏色黑色或紅色
2 根節點是黑色
3 葉子節點是黑色(葉子節點:指的的空節點)
4 如果一個節點是紅色,則它的子節點必須是黑色
5 從一個節點到該節點的子孫節點的所有路徑上包含相同數目的黑節點
總結:2,5特性確保了沒有一條路徑會比其他路徑長出兩倍,
因此紅黑樹是相對接近平衡的二叉樹!!!!!
紅黑樹的應用
主要用來儲存有序的資料,時間複雜度OlogN,效率非常高
例如:C++ STL中的set,map,以及Linux虛擬記憶體管理,應用紅黑樹實現
紅黑樹的基本操作-旋轉
紅黑樹基本操作是新增,刪除,但是操作後會破壞紅黑樹的性質,需要進行旋轉保持紅黑樹的特性
左旋+右旋細節參考:
https://www.cnblogs.com/skywang12345/p/3245399.html
左旋:
左旋 : (意味著被旋轉的節點將變成一個左節點)
將Y的左孩子B設為X的右孩子
將X設為Y左孩子的父節點
將X的父節點指設為Y的父節點
右旋
右旋:(意味被旋轉的節點將變成一個右節點)
將X的右孩子設為Y的左孩子
將Y設為X右孩子的父親
將Y的父親設定為X的父親
紅黑樹的基本操作—新增
第一步:將紅黑樹當作一顆二叉搜尋樹,將節點插入
找到合適的位置進行插入,插入後需要進行旋轉調整
第二步:將插入的節點著色為“紅色”
將插入節點著色為紅色不會違背特性5,即需要處理的情況就相對越少
第三步:通過一系列的旋轉或者著色操作,重新成為一顆紅黑樹
有可能違背特性(4): 如果一個節點是紅色的,則它的子節點必須是黑色的。
新增操作:
新建節點Y,將Y設為空節點
設紅黑樹T的根節點為X
找出要插入的節點Z,在二叉樹T中的位置Y
設定Z的父親為Y
情況1:若Y是空節點,則將Z設為根
情況2:若Z所包含的值<Y所包含的值,則將Z設為Y的左孩子
情況3:若Z所包含的值>Y所包含的值,則將Z設為Y的右孩子
Z的左孩子設為空,Z的右孩子設為空
對紅黑樹的節點進行顏色修飾和旋轉(省略.......具體參考https://www.cnblogs.com/skywang12345/p/3245399.html#a1)