基於QT Creator的紅黑樹

2021-08-31 23:47:18 字數 3687 閱讀 9362

採用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...