using System.Collections.Generic;
public static void Main()
int[] a = new int[]{1,2,3,4};
List<int[]> permutations = new List<int[]>();
heapPermutation(a, a.Length, a.Length, permutations);
foreach(int[] p in permutations)
BinaryTree b = new BinaryTree();
for (int i = 0; i < p.Length; i++)
total += b.GetTreeDepth();
Console.WriteLine("Average depth of all permutations: " + (float)total / (float)permutations.Count);
permutations = new List<int[]>();
fillRandomPermutations(permutations, a, r, 1000);
foreach(int[] p in permutations)
BinaryTree b = new BinaryTree();
for (int i = 0; i < p.Length; i++)
total += b.GetTreeDepth();
Console.WriteLine("Average depth of many random permutations: " + (float)total / (float)permutations.Count);
static void fillRandomPermutations(List<int[]> p, int[] a, Random r, int count)
int[] temp = (int[])a.Clone();
for (int i = 0; i < count; i++)
p.Add((int[])temp.Clone());
static void randomize(int[] arr, Random rand)
for (int i = 0; i < 100; i++)
int swapIndex1 = rand.Next(0,arr.Length);
int swapIndex2 = rand.Next(0,arr.Length);
int temp = arr[swapIndex1];
arr[swapIndex1] = arr[swapIndex2];
static void printArr(int[] a, int n)
for (int i = 0; i < n; i++)
Console.Write(a[i] + " ");
static void heapPermutation(int[] a, int size, int n, List<int[]> arrayList)
arrayList.Add((int[])a.Clone());
for (int i = 0; i < size; i++) {
heapPermutation(a, size - 1, n, arrayList);
public Node LeftNode { get; set; }
public Node RightNode { get; set; }
public int Data { get; set; }
public Node Root { get; set; }
public bool Add(int value)
Node before = null, after = this.Root;
else if (value > after.Data)
Node newNode = new Node();
before.LeftNode = newNode;
before.RightNode = newNode;
public int GetTreeDepth()
return this.GetTreeDepth(this.Root);
private int GetTreeDepth(Node parent)
return parent == null ? 0 : Math.Max(GetTreeDepth(parent.LeftNode), GetTreeDepth(parent.RightNode)) + 1;