紅黑樹各種操作
#include "stdafx.h"
#include
using namespace std;
enum mycolor;
typedef int dtype;
struct rbtree
;//查詢節點資訊
rbtree * search(rbtree * r,dtype val)
return x;
}//左旋轉
rbtree * left_rotate(rbtree * r,rbtree *x)
//右旋轉
rbtree * right_rotate(rbtree* r,rbtree *x)
//插入元素後,保持紅黑性
rbtree* keep_insert_rbtree(rbtree *r,rbtree *s)
else
s->parent->col = black;
s->parent->parent = red;
r = right_rotate(r,s->parent->parent);}}
else
else
s->parent->col = black;
s->parent->parent = red;
r = left_rotate(r,s->parent->parent);}}
}r->col = black;
return r;
}//插入元素
rbtree *insert(rbtree *r,rbtree *s)
s->parent = y;
if(y==null)
r = s;
else if(s->datadata)
y-left = s;
else
y->right = s;
s->left = null;
s->right = null;
s->col = red;
r = keep_insert_rbtree();
}return r;
}//取得最小值節點
rbtree * get_min(rbtree *r)
//取得最大值節點
rbtree * get_max(rbtree *r)
//取得中序前驅節點
rbtree * get_processor(rbtree *r,dtype val)
return q;}}
}//取得中序後繼節點
rbtree * get_successor(rbtree *r,dtype val)
return q;}}
}//刪除節點操作
rbtree *delete_node(rbtree *r,int val)
if(y->col==black)
r = keep_delete_rbtree(r,x);
}return r;
}//保持刪除節點後,樹的紅黑性
rbtree *keep_delete_rbtree(rbtree *r,rbtree *s)
if(w->left->col==black&&w->right->col==black)
else if(w->right->col==black)
else
}else}
s->col = black;
return r;
}int _tmain(int argc, _tchar* argv)
紅黑樹筆記 紅黑樹的插入操作
紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...
紅黑樹插入操作的各種情況分析
目錄 1.被插入的節點是根節點。2.被插入的節點的父節點是黑色。3.被插入的節點的父節點是紅色。3.1 叔叔結點為紅色 3.2 插入結點的父結點p是祖父結點pp的左子結點,插入結點的叔叔結點s不存在或為黑色 3.2.1 插入結點是父結點p的左子結點 3.2.2 插入結點是父結點p的右子結點 3.3 ...
紅黑樹刪除操作
紅黑樹刪除操作 紅黑樹要刪除某個key值時,首先還是要查詢該key值在樹中的位置,查詢方法和搜尋二叉樹方法相同 要刪除的結點分為兩種情況 有左右兩個孩子都存在 兩個孩子都存在時,在該節點的右子樹中尋找其直接後繼,找到後用其值替換要刪除節點的值,然後問題轉化為刪除該節點的直接後繼,直接後繼是有乙個右孩...