Advertisement
Guest User

BinarySearchTree.cs

a guest
Mar 21st, 2013
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.70 KB | None | 0 0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Text;
  5.  
  6. namespace TreeDataStructure
  7. {
  8.     public struct BinarySearchTree<T> : ICloneable, IEnumerable<TreeNode<T>>
  9.         where T : IComparable<T>
  10.     {
  11.         private TreeNode<T> root;
  12.  
  13.         public TreeNode<T> Find(T value)
  14.         {
  15.             return Find(this.root, value);
  16.         }
  17.  
  18.         private TreeNode<T> Find(TreeNode<T> node, T value)
  19.         {
  20.             int compareTo = value.CompareTo(node.Value);
  21.  
  22.             if (compareTo == 0)
  23.             {
  24.                 return node;
  25.             }
  26.  
  27.             if (compareTo < 0)
  28.             {
  29.                 if (node.LeftChild != null) return Find(node.LeftChild, value);
  30.                 else return null;
  31.             }
  32.             else
  33.             {
  34.                 if (node.RightChild != null) return Find(node.RightChild, value);
  35.                 else return null;
  36.             }
  37.         }
  38.  
  39.         public void AddElement(T value)
  40.         {
  41.             this.root = AddElement(value, null, root);
  42.         }
  43.  
  44.         private TreeNode<T> AddElement(T value, TreeNode<T> parentNode, TreeNode<T> node)
  45.         {
  46.             if (node == null)
  47.             {
  48.                 node = new TreeNode<T>(value);
  49.                 node.Parent = parentNode;
  50.             }
  51.             else
  52.             {
  53.                 int compareTo = value.CompareTo(node.Value);
  54.                 if (compareTo < 0)
  55.                 {
  56.                     node.LeftChild = AddElement(value, node, node.LeftChild);
  57.                 }
  58.                 else if (compareTo > 0)
  59.                 {
  60.                     node.RightChild = AddElement(value, node, node.RightChild);
  61.                 }
  62.             }
  63.  
  64.             return node;
  65.         }
  66.  
  67.         public void Remove(T value)
  68.         {
  69.             TreeNode<T> nodeToDelete = Find(value);
  70.             if (nodeToDelete == null)
  71.             {
  72.                 return;
  73.             }
  74.  
  75.             Remove(nodeToDelete);
  76.         }
  77.  
  78.         private void Remove(TreeNode<T> node)
  79.         {
  80.             if (node.LeftChild != null && node.RightChild != null)
  81.             {
  82.                 TreeNode<T> replacement = node.RightChild;
  83.                 while (replacement.LeftChild != null)
  84.                 {
  85.                     replacement = replacement.LeftChild;
  86.                 }
  87.                 node.Value = replacement.Value;
  88.                 node = replacement;
  89.             }
  90.  
  91.             TreeNode<T> theChild = node.LeftChild != null ?
  92.                     node.LeftChild : node.RightChild;
  93.  
  94.             if (theChild != null)
  95.             {
  96.                 theChild.Parent = node.Parent;
  97.  
  98.                 if (node.Parent == null)
  99.                 {
  100.                     root = theChild;
  101.                 }
  102.                 else
  103.                 {
  104.                     if (node.Parent.LeftChild == node)
  105.                     {
  106.                         node.Parent.LeftChild = theChild;
  107.                     }
  108.                     else
  109.                     {
  110.                         node.Parent.RightChild = theChild;
  111.                     }
  112.                 }
  113.             }
  114.             else
  115.             {
  116.                 if (node.Parent == null)
  117.                 {
  118.                     root = null;
  119.                 }
  120.                 else
  121.                 {
  122.                     if (node.Parent.LeftChild == node)
  123.                     {
  124.                         node.Parent.LeftChild = null;
  125.                     }
  126.                     else
  127.                     {
  128.                         node.Parent.RightChild = null;
  129.                     }
  130.                 }
  131.             }
  132.         }
  133.  
  134.         private void AppendNodes(ref StringBuilder builder, TreeNode<T> root)
  135.         {
  136.             if (root == null) return;
  137.  
  138.             AppendNodes(ref builder, root.LeftChild);
  139.             builder.Append(root.Value);
  140.             builder.Append(" ");
  141.             AppendNodes(ref builder, root.RightChild);
  142.         }
  143.  
  144.         public override string ToString()
  145.         {
  146.             StringBuilder builder = new StringBuilder();
  147.             AppendNodes(ref builder, this.root);
  148.             return builder.ToString();
  149.         }
  150.  
  151.         public override int GetHashCode()
  152.         {
  153.             int hashCode = 7;
  154.  
  155.             foreach (TreeNode<T> node in this)
  156.             {
  157.                 hashCode ^= node.Value.GetHashCode();
  158.             }
  159.             return hashCode;
  160.         }
  161.  
  162.         private void CheckEqualNodes(TreeNode<T> node1, TreeNode<T> node2, ref bool equal)
  163.         {
  164.             if (node1 == null && node2 == null) return; // must not compare null nodes
  165.  
  166.             if ((node1 != null && node2 == null) || (node1 == null && node2 != null) || node1.CompareTo(node2) != 0)
  167.             {
  168.                 // obviously null and something aren't equal
  169.                 equal = false;
  170.                 return;
  171.             }
  172.  
  173.             CheckEqualNodes(node1.LeftChild, node2.LeftChild, ref equal);
  174.             CheckEqualNodes(node1.RightChild, node2.RightChild, ref equal);
  175.         }
  176.  
  177.         public override bool Equals(object obj)
  178.         {
  179.             bool equal = true;
  180.             CheckEqualNodes(this.root, ((BinarySearchTree<T>)obj).root, ref equal);
  181.             return equal;
  182.         }
  183.  
  184.         public static bool operator ==(BinarySearchTree<T> t1, BinarySearchTree<T> t2)
  185.         {
  186.             return t1.Equals(t2);
  187.         }
  188.  
  189.         public static bool operator !=(BinarySearchTree<T> t1, BinarySearchTree<T> t2)
  190.         {
  191.             return !t1.Equals(t2);
  192.         }
  193.  
  194.         IEnumerator IEnumerable.GetEnumerator()
  195.         {
  196.             return (IEnumerator)GetEnumerator();
  197.         }
  198.  
  199.         public IEnumerator<TreeNode<T>> GetEnumerator()
  200.         {
  201.             List<TreeNode<T>> nodes = new List<TreeNode<T>>();
  202.             GetNextNode(root, ref nodes);
  203.  
  204.             foreach (TreeNode<T> node in nodes)
  205.                 yield return node;
  206.         }
  207.  
  208.         public void GetNextNode(TreeNode<T> node, ref List<TreeNode<T>> nodes)
  209.         {
  210.             if (node == null) return;
  211.  
  212.             GetNextNode(node.LeftChild, ref nodes);
  213.             nodes.Add(node);
  214.             GetNextNode(node.RightChild, ref nodes);
  215.         }
  216.  
  217.         public object Clone()
  218.         {
  219.             BinarySearchTree<T> clone = new BinarySearchTree<T>();
  220.             CopyNode(this.root, ref clone);
  221.             return clone;
  222.         }
  223.  
  224.         private void CopyNode(TreeNode<T> root, ref BinarySearchTree<T> tree)
  225.         {
  226.             if (root == null) return;
  227.  
  228.             tree.AddElement(root.Value);
  229.             CopyNode(root.LeftChild, ref tree);
  230.             CopyNode(root.RightChild, ref tree);
  231.         }
  232.     }
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement