演算法學習 紅黑樹

2021-07-02 19:38:48 字數 3981 閱讀 7062

1、紅黑樹是二叉收索樹的一種,可以保證在最壞情況系基本動態集合操作的時間複雜度為o(lgn)。本質是讓樹盡量均衡。

紅黑樹的定義(紅黑樹是在二叉收索樹的基礎上加上了下面的條件):

(1)每個節點或是紅色的,或是黑色的。

(2)根節點和葉結點是黑色的。(紅黑樹中將nil結點定義為也節點,稱為外部結點;把帶關鍵字的結點視為樹的內部結點)。

(3)如果乙個結點是紅色的,則它的兩個子結點是黑色的(父結點也是黑色的)。

(4)對每個結點,從該結點到其所有後代葉結點的簡單路徑上,均包括相同數目的黑色結點。(不含該結點的黑結點的數目稱為黑高

2、引理:一顆有n個內部結點的紅黑樹的高度至多為2lg(n+1)。

證明:

3、**的實現:

r_b_tree.h

#ifndef   __redblacktree

#define __redblacktree

#include

#include

using namespace std;

typedef enum nodecolornodecolor;

typedef struct nodenode;

class redblacktree;

#else

#pragma message("--redblacktree已編譯。")

#endif

r_b_tree.cpp

#include"r_b_tree.h"

redblacktree::redblacktree()

redblacktree::~redblacktree()

node * redblacktree::minimum(node *x)

while( x->left != &leaf )

return x; //最小

}node * redblacktree::maximum(node *x)

while( x->right != &leaf )

return x; //最大

}

node * redblacktree::successor(node *node)

node * redblacktree::predecessor(node *node)

node * redblacktree::search(int key)

return x; //查詢失敗是返回葉子結點

}void

redblacktree::leftrotate(node *x)

y->parent=x->parent;

if( x->parent == &leaf )elseelse

}y->left=x;

x->parent=y;

}void

redblacktree::rightrotate(node *y)

x->parent=y->parent;

if( y->parent == &leaf )elseelse

}x->right=y;

y->parent=x;

}void

redblacktree::insertfixup(node *z)else

z->parent->color=black; //情況三 左孩子

z->parent->parent->color=red;

this->rightrotate(z->parent->parent);

}}elseelse

z->parent->color=black; //情況三 左孩子

z->parent->parent->color=red;

this->leftrotate(z->parent->parent);}}

}root->color=black;

}void

redblacktree::insertnode(node *node)else

}node->parent=y;

if( y == &leaf )elseelse

}node->left=&leaf;

node->right=&leaf;

node->color=red;

this->insertfixup(node);

}void

redblacktree::inordertreewalk(node *x)else

cout<

key<

key<

keyright);

}}void

redblacktree::transplant(node *u,node *v)elseelse

}v->parent=u->parent;

}void

redblacktree::delletefixup(node *z)

if( w->left->color==black && w->right->color==black)else

w->color=z->parent->color;

z->parent->color=black;

w->right->color=black;

this->leftrotate(z->parent);

z=root;

}}else

if( w->left->color==black && w->right->color==black)else

w->color=z->parent->color;

z->parent->color=black;

w->left->color=black;

this->rightrotate(z->parent);

z=root;

} }}

z->color=black;

}void

redblacktree::delletenode(node *z)elseelseelse

transplant(z,y);

y->left=z->left;

y->left->parent=y;

y->color=z->color;}}

if(y_original_color==black)

delete z;

}

main.cpp

#include

#include

"r_b_tree.h"

int main()

cout<<

"建立的紅黑樹"

<

rb.inordertreewalk((rb.root));

if( rb.search(rb.root->key)->key==

0 )else

rb.delletenode((rb.root));

cout<<

"刪除根節點之後的紅黑樹 "

<

rb.inordertreewalk((rb.root));

if( rb.search(rb.root->key)->key==

0 )else

int asd;

cin>>asd;

return

0;}

執行截圖:

4、關於紅黑樹刪除的一些說明

紅黑樹所有操作裡,結點的刪除是最複雜的,相關的刪除的操作的詳細過程可以看部落格,寫的不錯,看過之後容易明白。在這裡我在新增關於4種情況的例項,從而可以更好理解紅黑樹刪除時的四種情況。

紅黑樹 學習

紅黑樹筆記 紅黑樹是一顆二叉平衡樹,查詢不會破壞平衡性,所以和二叉平衡術查詢方式一致。從根節點開始查詢,為空就返回null,為當前值就返回,否則繼續向下查詢。如果當前節點的key為要查詢的節點的key,那麼直接返回當前值。如果當前節點的key大於要查詢的節點的key,那麼繼續向當前節點的左子節點查詢...

演算法導論學習筆記 紅黑樹

紅黑樹的5個性質 1 每個結點要麼是紅的,要麼是黑的。2 根結點是黑的。3 每個葉結點,即空結點 nil 是黑的。4 如果乙個結點是紅的,那麼它的倆個兒子都是黑的。5 對每個結點,從該結點到其子孫結點的所有路徑上包含相同數目的黑結點。public class rbtree 當在某個結點nodex上,...

紅黑樹插入演算法

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