資料結構與演算法 紅黑樹(二)

2021-10-02 22:41:17 字數 4270 閱讀 9229

完善insert函式,讓它支援自動平衡

新插入的節點一定是紅色的

當新插入的節點是外部孫子節點使,進行一次單旋轉

當新插入的節點是內部孫子節點,進行一次雙旋轉

通用的旋轉函式

except.h異常類

#pragma once

#include using namespace std;

class d***ception

virtual ~d***ception() {};

virtual string tostring() const

virtual string what() const

private:

string message;

};class duplicateitemexception : public d***ception

};class nullpointerexception : public d***ception

};

#pragma once

#include "except.h"

template class cref

explicit cref( object &x) : obj(&x) {}

object &get() const else

} bool isnull() const

private:

object *obj;

};

redblacktree.h

#pragma once

#include #include "except.h"

/**紅黑樹規則:

*1.每乙個節點不是紅色就是黑色

*2.根總是黑色的

*3.如果節點是紅色,則他的子節點必須是黑色的

*4.從根到葉節點的每條路徑,必須包含相同數目的黑色節點

*/template class redblacktree;

template class redblacknode;

template class redblacktree ;

redblacktree(const comparable &neginf);

~redblacktree();

void insert(const comparable &x);

creffind(const comparable &x);

creffindmin() const;

creffindmax() const;

bool isempty() const;

void makeempty();

typedef redblacknodenode;

//private: 為了測試,臨時改為共有屬性

public:

node *header;

node *nullnode;

//當前節點

node *current;

//當前節點的父節點

node *parent;

//祖父節點

node *grand;

//曾祖父節點

node *great;

void rotatewithleftchild(node* &k2) const;

void rotatewithrightchild(node* &k1) const;

void doublerotatewithleftchild(node* &k3) const;

void doublerotatewithrightchild(node* &k1) const;

void handlereorient(const comparable &item);

redblacknode*rotate(const comparable &item,node *theparent) const;

void reclaimmemory(node* t) const;

};template class redblacknode

friend class redblacktree;

};template redblacktree::redblacktree(const comparable &neginf)

template redblacktree::~redblacktree()

template void redblacktree::insert(const comparable &x)

} if(current != nullnode)

current = new node(x,nullnode,nullnode);

if(x < parent->element) else

handlereorient(x);

}//帶著左孩子向右移動

template void redblacktree::rotatewithleftchild(node* &k2) const

//帶著右孩子向左移動

template void redblacktree::rotatewithrightchild(node* &k1) const

template void redblacktree::doublerotatewithleftchild(node* &k3) const

template void redblacktree::doublerotatewithrightchild(node* &k1) const

template void redblacktree::handlereorient(const comparable &item)

current = rotate(item,great);

current->color = black;

} header->right->color = black;

}//通用旋轉函式

/**theparent是item的父節點,item為被旋轉的節點

*旋轉可能性:

*左子樹像向轉,左子樹向右轉

*右子樹像向轉,右子樹向右轉

《資料結構與演算法》之紅黑樹

二叉查詢樹對於某個節點而言,其左子樹的節點關鍵值都小於該節點關鍵值,右子樹的所有節點關鍵值都大於該節點關鍵值。二叉查詢樹作為一種資料結構,其查詢 插入和刪除操作的時間複雜度都為 o logn 底數為 2。但是我們說這個時間複雜度是在平衡的二叉查詢樹上體現的,也就是如果插入的資料是隨機的,則效率很高,...

資料結構 紅黑樹

紅黑樹是二叉排序樹的改進,紅黑樹有幾個特點 1 節點只有2中顏色,紅色和黑色。2 根節點一定是黑色節點。3 紅色節點的子節點一定是黑色節點。4 黑色高度 根節點到每個葉子節點的路徑長度包含相同的黑色節點 相等。規定的插入的節點一定是紅色節點,紅黑樹的插入節點後需要調整的規則,插入節點需要調整的情況有...

資料結構 紅黑樹

一 紅黑樹 紅黑樹 red black tree 是一種自平衡二叉查詢樹,是在 電腦科學中用到的一種 資料結構 典型的用途是實現 關聯陣列 可以保證最長路徑不超過最短路徑的2倍,近似平衡。二 性質 性質1.節點是紅色或黑色。性質2.根節點是黑色。性質3 每個葉節點 nil節點,空節點 是黑色的。性質...