Example #1
0
        public ThreadedBinaryTree <T> BuildThreadedTree()
        {
            ThreadedBinaryTreeDummyNode <T> dummy = new ThreadedBinaryTreeDummyNode <T>();
            ThreadedBinaryTreeNode <T>      root  = BuildThreadedTree(Root, dummy, dummy);

            dummy.AddChild(root);
            return(new ThreadedBinaryTree <T>(dummy));
        }
Example #2
0
        public void InOrderTraverse(Action <ThreadedBinaryTreeNode <T> > action)
        {
            ThreadedBinaryTreeNode <T> successor = GetInOrderSuccessor(this.dummy);

            while (!ReferenceEquals(successor, this.dummy))
            {
                action(successor);
                successor = GetInOrderSuccessor(successor);
            }
        }
Example #3
0
 protected ThreadedBinaryTreeNode <T> GetPreOrderSuccessor(ThreadedBinaryTreeNode <T> node)
 {
     if (!node.IsLeftThreaded)
     {
         return(node.Left);
     }
     while (node.IsRightThreaded)
     {
         node = node.Right;
     }
     return(node.Right);
 }
Example #4
0
        public ThreadedBinaryTreeNode <T> RemoveRight()
        {
            if (IsRightThreaded)
            {
                throw new InvalidOperationException();
            }
            ThreadedBinaryTreeNode <T> result = Right;
            ThreadedBinaryTreeNode <T> right  = Right;

            this.isRightThreaded = true;
            while (!right.IsRightThreaded)
            {
                right = right.Right;
            }
            SetRight(right.Right);
            return(result);
        }
Example #5
0
        public ThreadedBinaryTreeNode <T> RemoveLeft()
        {
            if (IsLeftThreaded)
            {
                throw new InvalidOperationException();
            }
            ThreadedBinaryTreeNode <T> result = Left;
            ThreadedBinaryTreeNode <T> left   = Left;

            this.isLeftThreaded = true;
            while (!left.IsLeftThreaded)
            {
                left = left.Left;
            }
            SetLeft(left.Left);
            return(result);
        }
Example #6
0
        public ThreadedBinaryTreeNode <T> InsertRight(T value)
        {
            ThreadedBinaryTreeNode <T> node  = new ThreadedBinaryTreeNode <T>(value);
            ThreadedBinaryTreeNode <T> right = Right;
            bool isRT = IsRightThreaded;

            SetRight(node);
            this.isRightThreaded = false;
            node.SetRight(right);
            node.isRightThreaded = isRT;
            node.isLeftThreaded  = true;
            node.SetLeft(this);
            if (!isRT)
            {
                ThreadedBinaryTreeNode <T> n = right;
                while (!n.isLeftThreaded)
                {
                    n = n.Left;
                }
                n.SetLeft(node);
            }
            return(node);
        }
Example #7
0
        internal ThreadedBinaryTreeNode <T> BuildThreadedTree(BinaryTreeNodeBase <T> root, ThreadedBinaryTreeNode <T> nodeParent, ThreadedBinaryTreeNode <T> nodeRecentVisited)
        {
            if (root == null)
            {
                return(null);
            }
            bool isLeftThreaded              = (root.Left == null);
            bool isRightThreaded             = (root.Right == null);
            ThreadedBinaryTreeNode <T> node  = new ThreadedBinaryTreeNode <T>(root.Value, isLeftThreaded, null, isRightThreaded, null);
            ThreadedBinaryTreeNode <T> left  = BuildThreadedTree(root.Left, node, nodeRecentVisited);
            ThreadedBinaryTreeNode <T> right = BuildThreadedTree(root.Right, nodeParent, node);

            if (isLeftThreaded)
            {
                left = nodeRecentVisited;
            }
            if (isRightThreaded)
            {
                right = nodeParent;
            }
            node.AddChild(left);
            node.AddChild(right);
            return(node);
        }
Example #8
0
 public ThreadedBinaryTree(ThreadedBinaryTreeNode <T> root)
     : this(new ThreadedBinaryTreeDummyNode <T>(root))
 {
 }
Example #9
0
 internal ThreadedBinaryTreeNode(T value, ThreadedBinaryTreeNode <T> left) : base(value, left, null)
 {
     SetRight(this);
 }
Example #10
0
 public ThreadedBinaryTreeNode(T value, bool isLeftThreaded, ThreadedBinaryTreeNode <T> left, bool isRightThreaded, ThreadedBinaryTreeNode <T> right) : base(value, left, right)
 {
     this.isLeftThreaded  = isLeftThreaded;
     this.isRightThreaded = isRightThreaded;
 }
Example #11
0
 public ThreadedBinaryTreeNode(T value, ThreadedBinaryTreeNode <T> left, ThreadedBinaryTreeNode <T> right)
     : this(value, false, left, false, right)
 {
 }
Example #12
0
 public ThreadedBinaryTreeDummyNode(ThreadedBinaryTreeNode <T> root)
     : base(default(T), root)
 {
 }