예제 #1
0
 private void Print(node item, int top)
 {
     SwapColors();
     Print(item.Data, top, item.StartPos);
     SwapColors();
     if (item.GetLeft() != null)
     {
         PrintLink(top + 1, "┌", "┘", item.GetLeft().StartPos + item.GetLeft().Size / 2, item.StartPos);
     }
     if (item.GetRight() != null)
     {
         PrintLink(top + 1, "└", "┐", item.EndPos - 1, item.GetRight().StartPos + item.GetRight().Size / 2);
     }
 }
예제 #2
0
        public void InOrderTraversal(node current)
        {
            if (current.GetLeft() != null)
            {
                InOrderTraversal(current.GetLeft());
            }

            Console.Write($"{current.Data} -> ");

            if (current.GetRight() != null)
            {
                InOrderTraversal(current.GetRight());
            }
        }
예제 #3
0
 private node Traverse(dynamic _Data, node _Current)
 {
     //Check whether to branch to the right or the left in the tree.
     if (_Data < _Current.Data)
     {
         return(_Current.GetLeft());
     }
     return(_Current.GetRight());
 }
예제 #4
0
        public bool Delete(dynamic _Data)
        {
            //Traverse to the node we are trying to delete
            Current = Root;
            //try statement will run unless the node does not exitst, in which case it will throw an exception and return false.
            try
            {
                while (true)
                {
                    if (_Data != Current.Data)
                    {
                        Current = Traverse(_Data, Current);
                    }
                    else
                    {
                        break;
                    }
                }
            }
            catch
            {
                //If it can't be found, return false
                return(false);
            }

            if (Current.GetLeft() != null && Current.GetRight() != null)
            {
                //If it has 2 children
                node temp = Current.GetLeft();

                //Traverse to node that will replace Current
                while (true)
                {
                    if (temp.GetRight() != null)
                    {
                        temp = temp.GetRight();
                    }
                    else
                    {
                        break;
                    }
                }

                Current.Data = temp.Data;

                //Find if the temp node is a left or a right node before deleting.
                if (temp.GetParent() == Current)
                {
                    //If the current node is parent to our replacing node. (Only 1 level down)
                    Current.SetLeft(temp.GetLeft());
                    if (temp.GetLeft() != null)
                    {
                        temp.GetLeft().SetParent(temp.GetParent());
                    }
                }
                else
                {
                    //If we could traverse down the left hand side
                    if (temp.GetLeft() != null)
                    {
                        temp.GetParent().SetRight(temp.GetLeft());
                        temp.GetLeft().SetParent(temp.GetParent());
                    }
                    else
                    {
                        temp.GetParent().SetRight(null);
                    }
                }
                return(true);
            }
            else if (Current.GetLeft() != null || Current.GetRight() != null)
            {
                bool LeftFlag = false;

                if (Current == Root)
                {
                    if (Current.GetLeft() != null)
                    {
                        Root = Current.GetLeft();
                    }
                    else
                    {
                        Root = Current.GetRight();
                    }
                    return(true);
                }

                if (Current.Data < Current.GetParent().Data)
                {
                    LeftFlag = true;
                }

                if (Current.GetLeft() != null)
                {//If it has a left child
                    if (LeftFlag == true)
                    {
                        Current.GetParent().SetLeft(Current.GetLeft());
                    }
                    else
                    {
                        Current.GetParent().SetRight(Current.GetLeft());
                    }
                    Current.GetLeft().SetParent(Current.GetParent());
                }
                else  //If it has a right child
                {
                    if (LeftFlag == true)
                    {
                        Current.GetParent().SetLeft(Current.GetRight());
                    }
                    else
                    {
                        Current.GetParent().SetRight(Current.GetRight());
                    }
                    Current.GetRight().SetParent(Current.GetParent());
                }

                return(true);
            }
            else
            {
                //If it has no children
                if (Current == Root)
                {
                    Root = null;
                    return(true);
                }
                else
                {
                    //Set the parent's relevent pointer to null
                    if (Current.Data <= Current.GetParent().Data)
                    {
                        Current.GetParent().SetLeft(null);
                        return(true);
                    }
                    else
                    {
                        Current.GetParent().SetRight(null);
                        return(true);
                    }
                }
            }
        }