Thread Flags
enum Flags { ZERO = 0x00 , DEAD = 0x01, RED = 0x02 ,
LEFT_THREAD = 0x04 , RIGHT_THREAD = 0x08 , THREADS = LEFT_THREAD | RIGHT_THREAD };
class Node
{
T value_;
Node * lchild_,
* rchild_;
uint8_t flags_; // bit 3 = left threaded, bit 4 = right threaded
Node (const T& tval, Flags flags = DEFAULT)
: value_(tval), lchild_(0), rchild_(0), flags_(flags) // no-parent version
{}
friend class BST<T,P>;
friend class ThreadedBTIterator < BST <T,P> >;
...
bool HasLeftChild () const { return (lchild_ != nullptr) && !(IsLeftThreaded()); }
bool HasRightChild () const { return (rchild_ != nullptr) && !(IsRightThreaded()); }
bool IsLeftThreaded () const { return 0 != (LEFT_THREAD & flags_); }
bool IsRightThreaded () const { return 0 != (RIGHT_THREAD & flags_); }
void SetLeftThread (Node* n) { lchild_ = n; flags_ |= LEFT_THREAD; }
void SetRightThread (Node* n) { rchild_ = n; flags_ |= RIGHT_THREAD; }
void SetLeftChild (Node* n) { lchild_ = n; flags_ &= ~LEFT_THREAD; }
void SetRightChild (Node* n) { rchild_ = n; flags_ &= ~RIGHT_THREAD; }
...
};