| | | | | |

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; }
         ...
    };

| | Top of Page | 14. BST Iterators - 30 of 41