| | | | | |

Engineering Details 2

Add one byte to node for various flags: red/black, alive/dead plus room for 6 more

    enum Flags
    {
      ZERO = 0x00 , DEAD = 0x01, RED = 0x02 , LEFT_THREAD = 0x04 , RIGHT_THREAD = 0x08 
    };

    struct Node
    {
      ...
      // support for Erase
      bool IsDead   () const { return 0 != (DEAD & flags_); }
      bool IsAlive  () const { return !IsDead(); }
      void SetDead  ()       { flags_ |= DEAD; value_ = T(); }
      void SetAlive ()       { flags_ &= ~DEAD; }

      // support for color management
      bool IsRed    () const { return 0 != (RED & flags_); }
      bool IsBlack  () const { return !IsRed(); }
      void SetRed   ()       { flags_ |= RED; }
      void SetBlack ()       { flags_ &= ~RED; }

      // support for threaded iterators    
      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; }

      // support for search
      bool HasLeftChild       () const { return (lchild_ != nullptr) && !(IsLeftThreaded()); }
      bool HasRightChild      () const { return (rchild_ != nullptr) && !(IsRightThreaded()); }
      ...
    };  // struct BST_BASE<T,P>::Node


| | Top of Page | 12. Binary Search Trees - 30 of 41