Exemplo n.º 1
0
 public void AddSearchNode(Node node)
 {
     if (HeadNode == null)
     {
         HeadNode = node;
     }
     else
     {
         HeadNode.AddBinarySearchNode(node);
     }
 }
Exemplo n.º 2
0
        public bool RemoveNode(Node node)
        {
            var removeChildParentTuple = FindNodeAndParent(node);
            if (removeChildParentTuple.Item1 == null)
            {
                return false;
            }

            var currentNode = removeChildParentTuple.Item1;
            var parentNode = removeChildParentTuple.Item2;
            //Node we're removing has a null right 
            if (currentNode.RightNode == null)
            {
                if (parentNode == null)
                {
                    HeadNode = currentNode.LeftNode;
                }
                else
                {
                    var result = parentNode.CompareTo(currentNode);
                    if (result > 0)
                    {
                        parentNode.LeftNode = currentNode.LeftNode;
                    }
                    else if (result < 0)
                    {
                        parentNode.RightNode = currentNode.LeftNode;
                    }
                }
            }
            else if (currentNode.RightNode.LeftNode == null)
            {
                currentNode.RightNode.LeftNode = currentNode.LeftNode;

                if (parentNode == null)
                {
                    HeadNode = currentNode.RightNode;
                }
                else
                {
                    var result = parentNode.CompareTo(currentNode);
                    if (result > 0)
                    {
                        parentNode.LeftNode = currentNode.RightNode;
                    }
                    else if (result < 0)
                    {
                        parentNode.RightNode = currentNode.RightNode;
                    }
                }
            }
            else
            {
                var leftMost = currentNode.RightNode.LeftNode;
                var leftMostParent = currentNode.RightNode;

                while (leftMost.LeftNode != null)
                {
                    leftMostParent = leftMost;
                    leftMost = leftMost.LeftNode;
                }

                leftMostParent.LeftNode = leftMost.RightNode;

                leftMost.LeftNode = currentNode.LeftNode;
                leftMost.RightNode = currentNode.RightNode;

                if (parentNode == null)
                {
                    HeadNode = leftMost;
                }
                else
                {
                    var result = parentNode.CompareTo(currentNode);
                    if (result > 0)
                    {
                        parentNode.LeftNode = leftMost;
                    }
                    else if (result < 0)
                    {
                        parentNode.RightNode = leftMost;
                    }
                }
            }
            return true;
        }
Exemplo n.º 3
0
 public Tuple<Node, Node> FindNodeAndParent(Node node)
 {
     var currentNode = HeadNode;
     Node parent = null;
     while (currentNode != null)
     {
         var result = currentNode.CompareTo(node);
         if (result > 0)
         {
             parent = currentNode;
             currentNode = currentNode.LeftNode;
         }
         else if (result < 0)
         {
             parent = currentNode;
             currentNode = currentNode.RightNode;
         }
         else
         {
             break;
         }
     }
     return new Tuple<Node, Node>(currentNode, parent);
 }
Exemplo n.º 4
0
 public bool Contains(Node node)
 {
     var result = FindNodeAndParent(node);
     return result.Item1 != null;
 }
Exemplo n.º 5
0
 public void AddBalancedNode(Node node)
 {
     if (HeadNode == null)
     {
         HeadNode = node;
     }
     else
     {
         var queue = new Queue<Node>();
         queue.Enqueue(HeadNode);
         while (queue.Any())
         {
             var current = queue.Dequeue();
             if (current.LeftNode == null)
             {
                 current.LeftNode = node;
                 break;
             }
             else if (current.RightNode == null)
             {
                 current.RightNode = node;
                 break;
             }
             else
             {
                 queue.Enqueue(current.LeftNode);
                 queue.Enqueue(current.RightNode);
             }
         }
     }
 }
Exemplo n.º 6
0
        public void AddNodeEntrance(object param)
        {
            var newNode = new Node
            {
                Value = CurrentValue ?? 5,
                IsExpanded = true,
                IsSelected = true
            };
            if (SearchMethod)
            {
                AddSearchNode(newNode);
            }
            else
            {
                AddBalancedNode(newNode);
            }

            PropertyChanged(this, new PropertyChangedEventArgs("IsBinarySearchTree"));
        }
Exemplo n.º 7
0
 private static bool CompareToEverythingOnRight(Node node, int value)
 {
     if (node == null)
     {
         return true;
     }
     if (node.Value < value)
     {
         return false;
     }
     var leftSide = CompareToEverythingOnRight(node.LeftNode, value);
     var rightSide = CompareToEverythingOnRight(node.RightNode, value);
     return leftSide && rightSide;
 }
Exemplo n.º 8
0
 public void AddBinarySearchNode(Node node)
 {
     if (Value <= node.Value)
     {
         if (RightNode == null)
         {
             RightNode = node;
         }
         else
         {
             RightNode.AddBinarySearchNode(node);
         }
     }
     else
     {
         if (LeftNode == null)
         {
             LeftNode = node;
         }
         else
         {
             LeftNode.AddBinarySearchNode(node);
         }
     }
 }