1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- #pragma once
- // http://web.mit.edu/~emin/www/source_code/cpp_trees/index.html
- class RedBlackTreeNode
- {
- public:
- typedef int key_t;
- typedef void *val_t;
- friend class RedBlackTree;
- public:
- RedBlackTreeNode();
- RedBlackTreeNode(key_t, val_t);
- val_t GetEntry() const;
- ~RedBlackTreeNode();
- protected:
- val_t storedEntry;
- key_t key;
- int red; /* if red=0 then the node is black */
- RedBlackTreeNode *left;
- RedBlackTreeNode *right;
- RedBlackTreeNode *parent;
- };
- class RedBlackTree;
- class RedBlackTreeIterator
- {
- public:
- friend RedBlackTree;
- typedef int key_t;
- typedef void *val_t;
- RedBlackTreeIterator() : node(0), tree(0) {}
- RedBlackTreeIterator(RedBlackTreeNode *_node, RedBlackTree *_tree) : node(_node), tree(_tree) {}
- void next();
- bool get(val_t *val);
- private:
- RedBlackTreeNode *node;
- RedBlackTree *tree;
- };
- class RedBlackTree
- {
- public:
- typedef int key_t;
- typedef void *val_t;
- public:
- RedBlackTree();
- ~RedBlackTree();
- RedBlackTreeIterator end();
- RedBlackTreeIterator Insert(key_t, val_t);
- RedBlackTreeIterator Search(key_t key);
- RedBlackTreeIterator begin();
- // semi-public:
- void Delete(key_t key);
- val_t DeleteNode(RedBlackTreeNode *);
- RedBlackTreeNode *GetPredecessorOf(RedBlackTreeNode *) const;
- RedBlackTreeNode *GetSuccessorOf(RedBlackTreeNode *) const;
- size_t size() const;
- //TemplateStack<RedBlackTreeNode *> * Enumerate(int low, int high) ;
- protected:
- /* A sentinel is used for root and for nil. These sentinels are */
- /* created when RedBlackTreeCreate is caled. root->left should always */
- /* point to the node which is the root of the tree. nil points to a */
- /* node which should always be black but has aribtrary children and */
- /* parent and no key or info. The point of using these sentinels is so */
- /* that the root and nil nodes do not require special cases in the code */
- RedBlackTreeNode *root;
- RedBlackTreeNode *nil;
- void LeftRotate(RedBlackTreeNode *);
- void RightRotate(RedBlackTreeNode *);
- void TreeInsertHelp(RedBlackTreeNode *);
- void TreePrintHelper(RedBlackTreeNode *) const;
- void FixUpMaxHigh(RedBlackTreeNode *);
- void DeleteFixUp(RedBlackTreeNode *);
- size_t numElements;
- };
|