紅黑樹插入演算法的C 實現

2021-10-10 17:21:40 字數 3497 閱讀 9899

enum color

;struct tnode

;class

rbtree

; tnode* root = nil;

int size =0;

//節點數量

};

左旋:當在某個節點x上做左旋是,假設它的右孩子為y而不是t.nil; 左旋以x到y的鏈為「支軸」進行。它使y成為該子樹的新的根節點,x成為y的左孩子,y的左孩子成為x的右孩子;

左旋、右旋的示意圖如下:

演算法步驟示意圖:

相關**及注釋:

void

left_rotate

(rbtree &t, tnode* x)

// 將y的父節點置為x的父節點

y->p = x-

>p;

// 若x父節點為nil,則說明原x為根節點,設定y為新根

if(x-

>p == t.nil)

// 若原來x是x父節點((非空) 的左(右)節點,則將x的父節點左(右)指標設定為y

else

if(x == x-

>p-

>left)

else x-

>p-

>right = y;

// 將y的左孩子設為x,將x的父節點設為y

y->left = x;

x->p = y;

}void

right_rotate

(rbtree &t, tnode* y)

x->p = y-

>p;

if(y-

>p == t.nil)

else

if(y == y-

>p-

>left)

else y-

>p-

>right = x;

x->right = y;

y->p = x;

}

插入過程**:
void

rb_insert

(rbtree &t, tnode* z)

// 將z的p節點設為y,

z->p = y;

// 若y為nil,則說明t為空樹,設定z為新根

if(y == t.nil)

t.root = z;

// 若y非空,則按數值大小設為左孩子或右孩子

else

if(z-

>key < y-

>key)

y->left = z;

else y-

>right = z;

// 將z的左右孩子都設為nil,顏色設為red

z->left = t.nil;

z->right = t.nil;

z->color = red;

// 插入成功,節點數++

t.size++

;// 調整紅黑樹

rb_insert_fixup

(t, z)

;}

fixup調整過程**如下:
void

rb_insert_fixup

(rbtree &t, tnode* z)

else

if(z == z-

>p-

>right)

else

}// 二類:z的父節點是z祖父節點的右孩子,情況和一類相反

// 把一類的**,left和right互換即可

else

else

if(z == z-

>p-

>left)

else}}

t.root-

>color = black;

}

主程式測試說明程式輸入:

檔名: insert.txt

檔案格式:第一行為待插入資料的個數,第二行為待插入的資料(int型別, 空格分割)

注:1)初始時紅黑樹應為空。

2)按順序插入, 例如,對於下圖的資料,插入順序應為 20,10,14

程式輸出:

將插入完成後的紅黑樹進行 「先序遍歷(nlr)」 和 「中序遍歷(lnr)」 並將相應的遍歷序列輸出到檔案中。

檔名: lnr.txt 中序遍歷序列結果

nlr.txt 先序遍歷序列結果

格式:每一行對應乙個節點的資訊(key, color)

主程式**如下:

int

main()

cout<

cout<<

"先序遍歷輸出到檔案nlr.txt:"

<

pre_order

(t, t.root, ofile1)

; cout<

cout<<

"中序遍歷輸出到檔案lnr.txt:"

<

in_order

(t, t.root, ofile2);

ifile.

close()

; ofile1.

close()

; ofile2.

close()

;return0;

}

先序遍歷中序遍歷**如下:

void

pre_order

(rbtree &t, tnode* x, ofstream& ofile)

void

in_order

(rbtree &t, tnode* x, ofstream& ofile)

檢測結果1.輸入資料如下:8個待插入資料

2.插入調整之後的紅黑樹先序遍歷和中序遍歷輸出結果:

先序遍歷nlr結果如下:

中序遍歷結果如下:

3.結論:**執行沒有問題,資料處理結果正確,實驗結果符合預期要求

紅黑樹插入演算法

滿足下面幾個條件的二叉搜尋樹,稱為紅黑樹 1.任何乙個節點都被著色 紅色或是黑色。2.根節點是黑色的。3.所有的nil節點都看成黑色 nil節點是就是乙個假想的或是無實在意義的節點,所有應該指向null的指標,都看成指向了nil節點。包括葉節點的子節點指標或是根節點的父指標 4.如果乙個節點是紅色的...

紅黑樹(插入)

紅黑樹的插入操作相對刪除操作比較簡單。紅黑樹要滿足 任一節點至null的任何路徑,所含黑節點數必須相同。所以,為了滿足此性質,插入節點應該為紅色。如果插入節點的父親為黑色,則不需要進行調整,若為紅色,有三種情況需要討論。1.父節點為紅色,叔節點為紅色 對於這種情況,同時改變父 叔節點顏色為黑色,並將...

紅黑樹插入

一 什麼是紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在電腦科學中用到的一種資料結構,典型的用途是實現關聯陣列。紅黑樹是一棵二叉搜尋樹,它在每個結點上增加了乙個儲存位來表示結點的顏色,可以是red或black。一棵紅黑樹是滿足下面紅黑性質的二叉搜尋樹 1 每乙個結點或是紅...