採用qt的按鈕實現插入刪除等控制,採用qt的文字框輸出紅黑樹。
main.cpp
#include "mainwindow.h"
int main(int argc, char *argv)
"); w.show();
return a.exec();
}
mainwiindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
mainwindow::mainwindow(qwidget *parent) :
qmainwindow(parent),
ui(new ui::mainwindow)
mainwindow::~mainwindow()
bool mainwindow::getnum(int &i) //獲得鍵盤輸入的資料
void mainwindow::on_addbtn_clicked() //add槽函式
void mainwindow::on_delbtn_clicked() //deleet槽函式
void mainwindow::on_resetbtn_clicked() //clear槽函式
mainwindow.h
#ifndef mainwindow_h
#define mainwindow_h
#include #include #include #include #include namespace ui
class mainwindow : public qmainwindow
;#endif // mainwindow_h
rbtree.cpp
#include "rbtree.h"
void rbtree::rotate_left(node * x) //左旋,用於重構
void rbtree::rotate_right(node * x) //右旋,用於重構
void rbtree::destroy(node * node) //樹的銷毀
node *& rbtree::root()
void rbtree::insert_rebalance(node * x) //插入後重構
else //叔叔節點黑色
x->parent->color = black; // case 3當前節點為其父親節點左孩子
x->parent->parent->color = red;
rotate_right(x->parent->parent);}}
else //和上面相同,映象操作
else
x->parent->color = black;
x->parent->parent->color = red;
rotate_left(x->parent->parent);}}
}root()->color = black; //最後根節點重新著色為黑色
}void rbtree::erase_rebalance(node * z) //刪除後重構
if (y != z) //y是z的祖先// the third
else
x_parent = y;
if (root() == z)
root() = y;
else if (z->parent->left == z)
z->parent->left = y;
else
z->parent->right = y;
y->parent = z->parent;
swap(y->color, z->color);
y = z;
}else
//現在,y是想要刪除的節點!
// x是y的子節點,x必須是空節點
// 重構的實現
// .....
if (y->color == black)
if ((w->left == nullptr || w->left->color == black) && // case 2當前結點是黑色,兄弟結點是黑色,兩個孩子為空或是黑色
(w->right == nullptr || w->right->color == black))
else
w->color = x_parent->color; // case 4
x_parent->color = black; //當前結點是黑色,兄弟結點是黑色,兄弟結點的右孩子是紅色,左孩子為空或紅黑皆可
if (w->right)
w->right->color = black;
rotate_left(x_parent);
break;}}
else //和上面相同,映象操作
if ((w->right == nullptr || w->right->color == black) &&
(w->left == nullptr || w->left->color == black))
else
w->color = x_parent->color;
x_parent->color = black;
if (w->left)
w->left->color = black;
rotate_right(x_parent);
break;}}
} // while (x != root() && (x == nullptr || x->color == black))
if (x)
x->color = black;
} // if (y->color == black)
}rbtree::rbtree()
rbtree::~rbtree()
node * rbtree::insert(int key) //插入
cur = new node(key);
cur->parent = pre;
if (pre == header || key < pre->key)
pre->left = cur;
else
pre->right = cur;
insert_rebalance(cur); //重構
return cur;
}node * rbtree::find(int key) //查詢
return z;
}void rbtree::erase(int key) //刪除
}void rbtree::doprint(node *t, int level, qstring &str)
void rbtree::print(qstring &str)
rbtree.h
#ifndef rbtree_h
#define rbtree_h
#include #include #include using namespace std;
enum ;
struct node //採用三叉鍊錶表示樹的節點
};class rbtree
;#endif // rbtree_h
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹下 紅黑樹的實現
1.實現紅黑樹的基本思想 實際上,紅黑樹是有固定的平衡過程的 遇到什麼樣的節點分布,我們就對應怎麼去調整。只要按照這些固定的調整規則來操作,就能將乙個非平衡的紅黑樹調整成平衡的。首先,我們需要再來看一下紅黑樹的定義 在插入 刪除節點的過程中,第 三 四點要求可能會被破壞,所以 平衡調整 實際上就是把...
紅黑樹筆記 紅黑樹的插入操作
紅黑樹的插入操作可以在o logn 的時間內完成。開始插入節點的時候和二叉查詢樹一樣,只需要最後將插入的節點著成紅色,為了保證紅黑樹的性質,需要通過rb insertfixup函式來調整該節點,對其重新著色並旋轉。下面先呼叫rb insert 函式將乙個節點插入到紅黑樹中,同樣先上偽 rb inse...