紅黑樹系列之旋轉

2021-09-26 02:06:42 字數 1006 閱讀 2643

(1)概述 

二叉樹是使用非常廣泛的資料結構,但如果是常規的插入,會導致二叉樹的高度過高和出現整棵樹不平衡的情況。紅黑樹是一種平衡二叉樹,c++stl中的set,map及其擴充套件容器內部的資料結構都是紅黑樹。

(2)左旋轉

比如說,需要把x旋轉為y的左結點。整個演算法的思路非常清晰:從上至下,先得到y指標,講x的右指標指向y的左結點,然後利用parent函式得到x的父親結點,如果為null,則y為新的根,如果不為null,則根據x是其父親的左孩子還是右孩子,將指標指向y。最後將y的左指標指向x,完成旋轉。值得注意的是,演算法是具有順序的邏輯步驟,不能夠調換順序,如果改變賦值的順序會造成記憶體失去指標指向,出現記憶體錯誤。

**:注:parent為求父親結點的函式,root是始終指向根結點記憶體區域的指標。

//左旋轉,假設x->pright!=null

void left_rotate(node *head,node *x)//head是根結點,x是待左旋轉的結點

else

printf("item為%ld的結點不能夠進行左旋轉!",x->item);

}

(3)右旋轉

方法與左旋轉基本相同,只是方向相反,不再贅述其過程。

**:

//右旋轉,假設y->pleft!=null   

void right_rotate(node *head,node *y)//head是根結點,y是待右旋轉的結點

else

printf("item為%ld的結點不能夠進行右旋轉!",y->item);

}

//返回父親結點

node *parent(node *pnode,node *head)

if(head->pright!=null)

}return result;//沒有找到,返回null

}

總結:旋轉的演算法思路非常清晰,整個邏輯思考是重點。

紅黑樹系列之旋轉

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

紅黑樹系列之旋轉

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

紅黑樹 旋轉

此篇部落格我們討論紅黑樹的旋轉 左旋和右旋 為了更好的理解旋轉,我們只關注紅黑樹中關於二叉查詢樹部分的規則,而不關注紅黑樹中關於本身紅黑樹定義部分的規則。左旋現有紅黑樹結構如下 為了更好的理解,我們給節點x y a b和c乙個值,並把要進行左旋的節點x標為紅色 注意 和紅黑樹的紅色沒關係,僅僅起乙個...