完善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節點,空節點 是黑色的。性質...