Пример #1
0
 private void PostOrder(BinaryThreadTreeNode <T> node, Action <BinaryThreadTreeNode <T> > visitNode)
 {
     if (!node.IsLeftThread)
     {
         visitNode(node.LeftChild as BinaryThreadTreeNode <T>);
     }
     if (!node.IsRightThread)
     {
         visitNode(node.RightChild as BinaryThreadTreeNode <T>);
     }
     visitNode(node);
 }
Пример #2
0
        public void Threaded(TraversalType t)
        {
            BinaryThreadTreeNode <T> preNode = null;

            if (t == TraversalType.PreOrder)
            {
                PreOrder(Root as BinaryThreadTreeNode <T>,
                         (BinaryThreadTreeNode <T> node) =>
                {
                    if (preNode != null && preNode.IsRightThread)
                    {
                        preNode.RightChild = node;
                    }
                    if (node.LeftChild == null)
                    {
                        node.IsLeftThread = true;
                        node.LeftChild    = preNode;
                    }
                    if (node.RightChild == null)
                    {
                        node.IsRightThread = true;
                    }

                    preNode = node;
                });
            }

            else if (t == TraversalType.MidOrder)
            {
                MidOrder(Root as BinaryThreadTreeNode <T>,
                         (BinaryThreadTreeNode <T> node) =>
                {
                    if (preNode != null && preNode.IsRightThread)
                    {
                        preNode.RightChild = node;
                    }
                    if (node.LeftChild == null)
                    {
                        node.IsLeftThread = true;
                        node.LeftChild    = preNode;
                    }
                    if (node.RightChild == null)
                    {
                        node.IsRightThread = true;
                    }

                    preNode = node;
                });
            }

            else if (t == TraversalType.PostOrder)
            {
                PostOrder(Root as BinaryThreadTreeNode <T>,
                          (BinaryThreadTreeNode <T> node) =>
                {
                    if (preNode != null && preNode.IsRightThread)
                    {
                        preNode.RightChild = node;
                    }
                    if (node.LeftChild == null)
                    {
                        node.IsLeftThread = true;
                        node.LeftChild    = preNode;
                    }
                    if (node.RightChild == null)
                    {
                        node.IsRightThread = true;
                    }

                    preNode = node;
                });
            }
        }