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.如果乙個節點是紅色的...