Generic BinaryHeap implementation with C#

namespace BinaryHeap
{
    using System;
    using System.Collections.Generic;

    public class BinaryHeap<T> where T : IComparable<T>
    {
        private IList<T> heap;

        public BinaryHeap(T[] elements = null)
        {
            if (elements != null)
            {
                this.heap = new List<T>(elements);
                for (int i = elements.Length / 2; i >= 0; i--)
                {
                    this.HeapifyDown(i);
                }
            }
            else
            {
                this.heap = new List<T>();
            }
        }

        public int Count
        {
            get
            {
                return this.heap.Count;
            }
        }

        public T ExtractMax()
        {
            var max = this.heap[0];
            this.heap[0] = this.heap[this.Count - 1];
            this.heap.RemoveAt(this.Count - 1);

            if (this.Count > 0)
            {
                this.HeapifyDown(0);
            }

            return max;
        }

        public T PeekMax()
        {
            var max = this.heap[0];

            return max;
        }

        public void Insert(T node)
        {
            this.heap.Add(node);

            this.HeapifyUp(this.Count - 1);
        }

        private void HeapifyDown(int i)
        {
            var leftChild = (i * 2) + 1;
            var rightChild = (i * 2) + 2;
            var biggest = i;

            if (leftChild < this.Count && this.heap[leftChild].CompareTo(this.heap[biggest]) > 0)
            {
                biggest = leftChild;
            }

            if (rightChild < this.Count && this.heap[rightChild].CompareTo(this.heap[biggest]) > 0)
            {
                biggest = rightChild;
            }

            if (biggest != i)
            {
                T old = this.heap[i];
                this.heap[i] = this.heap[biggest];
                this.heap[biggest] = old;
                this.HeapifyDown(biggest);
            }
        }

        private void HeapifyUp(int i)
        {
            var parent = (i - 1) / 2;
            while (i > 0 && this.heap[i].CompareTo(this.heap[parent]) > 0)
            {
                var temp = this.heap[parent];
                this.heap[parent] = this.heap[i];
                this.heap[i] = temp;
                i = parent;
                parent = (i - 1) / 2;
            }
        }
    }
}

Simple implementation of generic BINARY TREE in C#

using System;
public class BinaryTree
{
	public BinaryTree(
		T value,
		BinaryTree leftNode = null,
		BinaryTree rightNode = null)
	{
		this.Value = value;
		this.LeftNode = leftNode;
		this.RightNode = rightNode;
	}

	public T Value { get; private set; }

	public BinaryTree LeftNode { get; private set; }

	public BinaryTree RightNode { get; private set; }

	public void EachPreOrder(Action action)
	{
		action(this.Value);

		if (this.LeftNode != null)
		{
			this.LeftNode.EachPreOrder(action);
		}

		if (this.RightNode != null)
		{
			this.RightNode.EachPreOrder(action);
		}
	}

	public void EachInOrder(Action action)
	{
		if (this.LeftNode != null)
		{
			this.LeftNode.EachPreOrder(action);
		}

		action(this.Value);

		if (this.RightNode != null)
		{
			this.RightNode.EachPreOrder(action);
		}
	}

	public void EachPostOrder(Action action)
	{
		if (this.LeftNode != null)
		{
			this.LeftNode.EachPreOrder(action);
		}

		if (this.RightNode != null)
		{
			this.RightNode.EachPreOrder(action);
		}
		
		action(this.Value);
	}
}

Simple implementation of generic TREE in C#

using System;
using System.Collections.Generic;

public class Tree<T>
{
	public Tree(
		T value,
		params Tree<T>[] children)
	{
		this.Value = value;

		this.Children = new List<Tree<T>>();
		foreach (var child in children)
		{
			this.Children.Add(child);
		}
	}
		
	public T Value { get; private set; }

	public ICollection<Tree<T>> Children { get; private set; }

	public void EachTree(Action<T> action)
	{
		action(this.Value);

		foreach (var child in this.Children)
		{
			child.EachTree(action);
		}
	}

	public void PrintTree(int indent = 0)
	{
		Console.WriteLine(new string(' ', indent * 2) + this.Value);
		indent++;
		foreach (var child in this.Children)
		{
			child.PrintTree(indent);
		}
	}
}

Simple dynamic implementation of generic QUEUE in C#

using System;

public class LinkedQueue<T>
{
	private LinkedQueueNode<T> start;
	private LinkedQueueNode<T> end;

	public LinkedQueue()
	{
		this.Count = 0;
	}

	public int Count { get; private set; }

	public void Enqueue(T element)
	{
		var newElement = new LinkedQueueNode<T>(element);

		if (this.Count == 0)
		{
			this.start = this.end = newElement;
		}
		else
		{
			this.end.Next = newElement;
			this.end = newElement;
		}

		this.Count++;
	}

	public T Dequeue()
	{
		if (this.Count <= 0)
		{
			throw new InvalidOperationException("Queue is empty.");
		}

		var elementToReturn = this.start;
		this.start = this.start.Next;
		this.Count--;

		return elementToReturn.Value;
	}

	public T Peak()
	{
		if (this.Count <= 0)
		{
			throw new InvalidOperationException("Queue is empty.");
		}

		var currentElement = this.start.Value;

		return currentElement;
	}

	public T[] ToArray()
	{
		var arrToReturn = new T[this.Count];
		var currentNode = this.start;
		var arrIndex = 0;
		while (currentNode != null)
		{
			arrToReturn[arrIndex] = currentNode.Value;
			arrIndex++;
			currentNode = currentNode.Next;
		}

		return arrToReturn;
	}
	
	private class LinkedQueueNode<T>
	{
		public LinkedQueueNode(T value)
		{
			this.Value = value;
		}

		public T Value { get; private set; }

		public LinkedQueueNode<T> Next { get; set; }
	}
}