-
-
Save aaronjwood/7e0fc962c5cd898b3181 to your computer and use it in GitHub Desktop.
using System; | |
using System.Diagnostics; | |
namespace BinarySearchTree | |
{ | |
class Node | |
{ | |
public int value; | |
public Node left; | |
public Node right; | |
} | |
class Tree | |
{ | |
public Node insert(Node root, int v) | |
{ | |
if (root == null) | |
{ | |
root = new Node(); | |
root.value = v; | |
} | |
else if (v < root.value) | |
{ | |
root.left = insert(root.left, v); | |
} | |
else | |
{ | |
root.right = insert(root.right, v); | |
} | |
return root; | |
} | |
public void traverse(Node root) | |
{ | |
if (root == null) | |
{ | |
return; | |
} | |
traverse(root.left); | |
traverse(root.right); | |
} | |
} | |
class BinarySearchTree | |
{ | |
static void Main(string[] args) | |
{ | |
Node root = null; | |
Tree bst = new Tree(); | |
int SIZE = 2000000; | |
int[] a = new int[SIZE]; | |
Console.WriteLine("Generating random array with {0} values...", SIZE); | |
Random random = new Random(); | |
Stopwatch watch = Stopwatch.StartNew(); | |
for (int i = 0; i < SIZE; i++) | |
{ | |
a[i] = random.Next(10000); | |
} | |
watch.Stop(); | |
Console.WriteLine("Done. Took {0} seconds", (double)watch.ElapsedMilliseconds / 1000.0); | |
Console.WriteLine(); | |
Console.WriteLine("Filling the tree with {0} nodes...", SIZE); | |
watch = Stopwatch.StartNew(); | |
for (int i = 0; i < SIZE; i++) | |
{ | |
root = bst.insert(root, a[i]); | |
} | |
watch.Stop(); | |
Console.WriteLine("Done. Took {0} seconds", (double)watch.ElapsedMilliseconds / 1000.0); | |
Console.WriteLine(); | |
Console.WriteLine("Traversing all {0} nodes in tree...", SIZE); | |
watch = Stopwatch.StartNew(); | |
bst.traverse(root); | |
watch.Stop(); | |
Console.WriteLine("Done. Took {0} seconds", (double)watch.ElapsedMilliseconds / 1000.0); | |
Console.WriteLine(); | |
Console.ReadKey(); | |
} | |
} | |
} |
One question is, what happens when the random generator returns many same values?
then they keep getting added to the right most node where it is null ?
wonder what these same values mean in BST.
Looks like there is a mistake
what will happens if root value equals v?
Thanks all, didn't realize this had so many comments until now!
To the question above: this implementation is allowing for duplicate values so line 26 will be taken. If you have a LOT of duplicate values this code will surely stack overflow. For example, change a[i] = random.Next(10000);
to a[i] = random.Next(10);
. If you change it to a[i] = random.Next(1000);
the part that fills the tree takes an extremely long time to complete since you can imagine how inefficient it has become. Not good :)
Thanks a lot! It's really helpful.
Nice!
Very good code and easy to understand. Thank you!