紅黑樹 旋轉

2021-08-19 15:22:42 字數 2093 閱讀 9857

此篇部落格我們討論紅黑樹的旋轉(左旋和右旋),為了更好的理解旋轉,我們只關注紅黑樹中關於二叉查詢樹部分的規則,而不關注紅黑樹中關於本身紅黑樹定義部分的規則。

左旋

現有紅黑樹結構如下:

為了更好的理解,我們給節點x、y、a、b和c乙個值,並把要進行左旋的節點x標為紅色(注意:和紅黑樹的紅色沒關係,僅僅起乙個提示的作用);

我們再接著分析,此時我們需要對節點x進行左旋操作,這就意味著要以節點x為軸心,然後把節點x的右子樹y往左旋轉,也就是乙個上浮,結果如下:

此時左旋完畢,但是樹形結構已經不符合二叉樹的結構標準了,所以我們還要進行進行一步處理,也就是節點b該往哪放的問題?我們可以先試一下,如下:

這麼放有問題嗎?

很顯然這裡違背了二叉查詢樹的規則,儘管節點b比節點c的值要小,看似作為節點c的左子節點是正確的,但是不要忘了未旋轉前,節點b是節點y的左子節點,所以節點b的值比節點y的值也要小,因此節點b壓根就不能放在節點y的右子樹,那我們再換一種放法,如下:

現在我們再看一下,發現問題已經完美解決!

右旋
現有紅黑樹結構如下:

為了更好的理解,我們給節點x、y、a、b和c乙個值,並把要進行右旋的節點x標為紅色(注意:和紅黑樹的紅色沒關係,僅僅起乙個提示作用);

我們再接著分析,此時我們需要對節點x進行右旋操作,這就意味著要以節點x為軸心,然後把節點x的左子樹y往右旋轉,也就是乙個上浮,結果如下:

此時右旋完畢,但是樹形結構已經不符合二叉樹的結構標準了,所以我們還要進行進行一步處理,也就是節點c該往哪放的問題?我們可以先試一下,如下:

這麼放有問題嗎?

很顯然這裡違背了二叉查詢樹的規則,儘管節點c比節點b的值要大,看似作為節點b的右子節點是正確的,但是不要忘了未旋轉前,節點c是節點y的右子節點,所以節點c的值比節點y的值也要大,因此節點c壓根就不能放在節點y的左子樹,那我們再換一種放法,如下:

現在我們再看一下,發現問題已經完美解決!

總結

旋轉時只需要關注二叉查詢樹部分的規則即可;

左/右旋就是以旋轉的節點為軸心,把它的右/左子樹進行上浮;

上浮之後對於中間多餘的節點按照二叉查詢樹的規則重新放即可;

不需要死記硬背,需要旋轉時自己畫一畫就出來了;

紅黑樹系列之旋轉

1 概述 二叉樹是使用非常廣泛的資料結構,但如果是常規的插入,會導致二叉樹的高度過高和出現整棵樹不平衡的情況。紅黑樹是一種平衡二叉樹,c stl中的set,map及其擴充套件容器內部的資料結構都是紅黑樹。2 左旋轉 注 parent為求父親結點的函式,root是始終指向根結點記憶體區域的指標。左旋轉...

紅黑樹系列之旋轉

1 概述 二叉樹是使用非常廣泛的資料結構,但如果是常規的插入,會導致二叉樹的高度過高和出現整棵樹不平衡的情況。紅黑樹是一種平衡二叉樹,c stl中的set,map及其擴充套件容器內部的資料結構都是紅黑樹。2 左旋轉 比如說,需要把x旋轉為y的左結點。整個演算法的思路非常清晰 從上至下,先得到y指標,...

紅黑樹系列之旋轉

1 概述 二叉樹是使用非常廣泛的資料結構,但如果是常規的插入,會導致二叉樹的高度過高和出現整棵樹不平衡的情況。紅黑樹是一種平衡二叉樹,c stl中的set,map及其擴充套件容器內部的資料結構都是紅黑樹。2 左旋轉 比如說,需要把x旋轉為y的左結點。整個演算法的思路非常清晰 從上至下,先得到y指標,...