1998-04-22 22:28:48 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* This file defines the binary tree class and its
|
|
|
|
* nsNode child class.
|
|
|
|
*
|
|
|
|
* This simple version stores nodes, and the
|
|
|
|
* nodes store void* ptrs.
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
|
|
|
|
/**
|
|
|
|
* MODULE NOTES
|
|
|
|
* @update gess 4/11/98
|
|
|
|
*
|
|
|
|
* This file declares the nsRBTree (red/black tree).
|
|
|
|
* Red/black trees are auto-balancing binary trees.
|
|
|
|
*
|
|
|
|
* To use this class, define a subclass of nsNode
|
|
|
|
* which stores your data type. It's important that
|
|
|
|
* you overload the following methods:
|
|
|
|
*
|
|
|
|
* virtual PRBool operator<()
|
|
|
|
* virtual PRBool operator==()
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef _nsRBTree
|
|
|
|
#define _nsRBTree
|
|
|
|
|
|
|
|
|
|
|
|
#include "nsBTree.h"
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Here comes the main event: our nsRBTree (red/black tree).
|
|
|
|
* Red/Black trees are autobalancing binary trees.
|
|
|
|
*
|
|
|
|
* @update gess4/20/98
|
|
|
|
*/
|
|
|
|
|
|
|
|
class NS_BASE nsRBTree : public nsBTree {
|
|
|
|
public:
|
|
|
|
friend class NS_BASE nsRBTreeIterator;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* nsRBTree constructor
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
*/
|
|
|
|
nsRBTree();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* nsRBTree constructor
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
*/
|
|
|
|
nsRBTree(const nsRBTree& aCopy);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* nsRBTree destructor
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
*/
|
1998-07-25 06:11:02 +04:00
|
|
|
virtual ~nsRBTree();
|
1998-04-22 22:28:48 +04:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Given a node, we're supposed to add it into
|
|
|
|
* our tree.
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
nsNode* Add(nsNode& aNode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrive the first node in the tree
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
nsNode* First(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the first node given a starting node
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param aNode --
|
|
|
|
* @return node ptr or null
|
|
|
|
*/
|
|
|
|
nsNode* First(nsNode& aNode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find the last node in the tree
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return node ptr or null
|
|
|
|
*/
|
|
|
|
nsNode* Last(void);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find the last node from a given node
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param aNode -- node ptr to start from
|
|
|
|
* @return node ptr or null
|
|
|
|
*/
|
|
|
|
nsNode* Last(nsNode& aNode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the node that preceeds the given node
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param aNode -- node to find precedent of
|
|
|
|
* @return preceeding node ptr, or null
|
|
|
|
*/
|
|
|
|
nsNode* Before(nsNode& aNode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve a ptr to the node following the given node
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param aNode -- node to find successor node from
|
|
|
|
* @return node ptr or null
|
|
|
|
*/
|
|
|
|
nsNode* After(nsNode& aNode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Find a (given) node in the tree
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param node to find in the tree
|
|
|
|
* @return node ptr (if found) or null
|
|
|
|
*/
|
|
|
|
nsNode* Find(nsNode& aNode);
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Causes a shift to the left, to keep the
|
|
|
|
* underlying RB data in balance
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return this
|
|
|
|
*/
|
|
|
|
nsRBTree& ShiftLeft(nsNode& aNode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Causes a shift right to occur, to keep the
|
|
|
|
* underlying RB data in balance
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param aNode -- node at which to perform shift
|
|
|
|
* @return this
|
|
|
|
*/
|
|
|
|
nsRBTree& ShiftRight(nsNode& aNode);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Rebalances tree around the given node. This only
|
|
|
|
* needs to be called after a node is deleted.
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param aNode -- node to balance around
|
|
|
|
* @return this
|
|
|
|
*/
|
|
|
|
virtual nsBTree& ReBalance(nsNode& aNode);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
class NS_BASE nsRBTreeIterator {
|
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* TreeIterator constructor
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
nsRBTreeIterator(const nsRBTree& aTree);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* TreeIterator constructor
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
nsRBTreeIterator(const nsRBTreeIterator& aCopy);
|
|
|
|
|
|
|
|
/**
|
|
|
|
* tree iterator destructor
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param
|
|
|
|
* @return
|
|
|
|
*/
|
|
|
|
~nsRBTreeIterator();
|
|
|
|
|
|
|
|
/**
|
|
|
|
* This method iterates over the tree, calling
|
|
|
|
* aFunctor for each node.
|
|
|
|
*
|
|
|
|
* @update gess 4/11/98
|
|
|
|
* @param aFunctor -- object to call for each node
|
|
|
|
* @param aNode -- node at which to start iteration
|
|
|
|
* @return this
|
|
|
|
*/
|
|
|
|
const nsRBTreeIterator& ForEach(nsNodeFunctor& aFunctor) const;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
const nsRBTree& mTree;
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
1998-04-26 07:13:20 +04:00
|
|
|
#endif
|