紅黑樹的各種操作

2021-07-27 07:19:10 字數 1752 閱讀 6156

紅黑樹各種操作

#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值在樹中的位置,查詢方法和搜尋二叉樹方法相同 要刪除的結點分為兩種情況 有左右兩個孩子都存在 兩個孩子都存在時,在該節點的右子樹中尋找其直接後繼,找到後用其值替換要刪除節點的值,然後問題轉化為刪除該節點的直接後繼,直接後繼是有乙個右孩...