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 dynamic implementation of generic STACK in C#

using System;

public class LinkedStack<T>
{
	private LinkedStackNode<T> firstNode;

	public int Count { get; private set; }

	public void Push(T element)
	{
		var newNode = new LinkedStackNode<T>(element);

		newNode.NextNode = this.firstNode;
		this.firstNode = newNode;

		this.Count++;
	}

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

		var nodeToPop = this.firstNode;
		this.firstNode = this.firstNode.NextNode;
		this.Count--;

		return nodeToPop.Value;
	}

	public T Peek()
	{
		var nodeToPeek = this.firstNode;

		return nodeToPeek.Value;
	}

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

		return arr;
	}

	private class LinkedStackNode<T>
	{
		public LinkedStackNode(
			T value,
			LinkedStackNode<T> nextNode = null)
		{
			this.Value = value;
		}

		public T Value { get; private set; }

		public LinkedStackNode<T> NextNode { get; set; }
	}
}

Simple static implementation of generic STACK in C#

using System;

public class ArrayStack<T> : IArrayStack<T>
{
	private const int InitialCapacity = 16;

	private T[] internalStorage;
	private int capacity;

	public ArrayStack(int capacity = InitialCapacity)
	{
		this.Capacity = capacity;
		this.internalStorage = new T[this.Capacity];
	}

	public int Count { get; private set; }

	private int Capacity
	{
		get
		{
			return this.capacity;
		}

		set
		{
			if (value <= 0)
			{
				throw new ArgumentOutOfRangeException(
					nameof(value),
					"Capacity should be positive integer number.");
			}

			this.capacity = value;
		}
	}

	public void Push(T element)
	{
		if (this.GrowNeeded())
		{
			this.Grow();
		}

		this.internalStorage[this.Count] = element;
		this.Count++;
	}

	public T Pop()
	{
		if (this.Count <= 0)
		{
			throw new InvalidOperationException("Stack is empty.");
		}
		
		this.Count--;
		var element = this.internalStorage[this.Count];
		this.internalStorage[this.Count] = default(T);

		return element;
	}

	public T Peek()
	{
		var element = this.internalStorage[this.Count - 1];

		return element;
	}

	public T[] ToArray()
	{
		var arr = new T[this.Count];
		this.FillStorage(arr);
		Array.Reverse(arr);

		return arr;
	}

	private bool GrowNeeded()
	{
		var result = this.Count >= this.Capacity;

		return result;
	}

	private void Grow()
	{
		this.Capacity *= 2;
		var newStorage = new T[this.Capacity];
		this.FillStorage(newStorage);
		this.internalStorage = newStorage;
	}

	private void FillStorage(T[] array)
	{
		Array.Copy(this.internalStorage, array, this.Count);
	}
}

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; }
	}
}

Simple static implementation of generic QUEUE in C#

public class CircularQueue<T>
{
	private const int InitialCapacity = 16;

	private T[] storage;

	private int capacity;
	private int startIndex;
	private int endIndex;

	public CircularQueue(int capacity = InitialCapacity)
	{
		this.Capacity = capacity;
		this.storage = new T[this.Capacity];
	}

	public int Count { get; private set; }

	private int Capacity
	{
		get
		{
			return this.capacity;
		}

		set
		{
			if (value <= 0)
			{
				throw new ArgumentOutOfRangeException(
					nameof(value),
					"Queue capacity should be a positive integer");
			}

			this.capacity = value;
		}
	}

	public void Enqueue(T element)
	{
		if (this.GrowNeeded())
		{
			this.Grow();
		}

		this.storage[this.endIndex] = element;
		this.endIndex = (this.endIndex + 1) % this.Capacity;
		this.Count++;
	}

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

		var element = this.storage[this.startIndex];
		this.storage[this.startIndex] = default(T);
		this.startIndex = (this.startIndex + 1) % this.Capacity;
		this.Count--;

		return element;
	}

	public T[] ToArray()
	{
		var resultArray = new T[this.Count];
		this.ResizeArrayStorage(resultArray);

		return resultArray;
	}

	private bool GrowNeeded()
	{
		var result = this.Count >= this.Capacity;

		return result;
	}

	private void Grow()
	{
		var newStorage = new T[this.Capacity * 2];
		this.ResizeArrayStorage(newStorage);
		this.startIndex = 0;
		this.endIndex = this.Capacity;
		this.Capacity *= 2;

		this.storage = newStorage;
	}

	private void ResizeArrayStorage(T[] array)
	{
		for (int i = 0; i < this.Count; i++)
		{
			var currentIndex = (this.startIndex + i) % this.Capacity;
			array[i] = this.storage[currentIndex];
		}
	}
}

How to calculate factorial with single line of code in C#

using System;
using System.Linq;
using System.Numerics;

public static class Factorial
{
    public static void Main(string[] args)
    {
        int num = 100;
        Console.WriteLine(Enumerable.Range(1, num).Select(i => new BigInteger(i)).Aggregate((a, b) => a * b));
    }
}
// 93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

How to generate Permutations without repetition recursively in C#

using System;

class GroupPermutations
{
    static void Main(string[] args)
    {
        string[] array = { "apple", "peach", "orange" };
        Perm(array, 0);
    }

    static void Perm<T>(T[] arr, int k)
    {
        if (k >= arr.Length)
            Print(arr);
        else
        {
            Perm(arr, k + 1);
            for (int i = k + 1; i < arr.Length; i++)
            {
                Swap(ref arr[k], ref arr[i]);
                Perm(arr, k + 1);
                Swap(ref arr[k], ref arr[i]);
            }
        }
    }

    private static void Swap<T>(ref T item1, ref T item2)
    {
        T temp = item1;
        item1 = item2;
        item2 = temp;
    }

    private static void Print<T>(T[] arr)
    {
        Console.WriteLine("{" + string.Join(", ", arr) + "}");
    }
}

//Result:
//{apple, peach, orange}
//{apple, orange, peach}
//{peach, apple, orange}
//{peach, orange, apple}
//{orange, peach, apple}
//{orange, apple, peach}

How to fill matrix in spiral order Java

public class SpiralMatrix {
    public static void main(String[] args) {
        int[][] matrix = new int[7][7];
        int top = 0;
        int bottom = matrix.length - 1;
        int left = 0;
        int right = matrix[0].length - 1;
        int index = 1;

        while (left <= right && top <= bottom) {
            for (int col = left; col <= right; col++) {
                matrix[top][col] = index++;
            }

            top++;
            for (int row = top; row <= bottom; row++) {
                matrix[row][right] = index++;
            }

            right--;
            for (int col = right; col >= left ; col--) {
                matrix[bottom][col] = index++;
            }

            bottom--;
            for (int row = bottom; row >= top ; row--) {
                matrix[row][left] = index++;
            }

            left++;
        }


        for (int row = 0; row < matrix.length; row++) {
            for (int col = 0; col < matrix[0].length; col++) {
                System.out.printf("%02d ", matrix[row][col]);
            }
            System.out.println();
        }
        
        // result:
        // 01 02 03 04 05 06 07
        // 24 25 26 27 28 29 08
        // 23 40 41 42 43 30 09
        // 22 39 48 49 44 31 10
        // 21 38 47 46 45 32 11
        // 20 37 36 35 34 33 12
        // 19 18 17 16 15 14 13
    }
}

How to convert decimal number to hexadecimal in C# using method

    using System;
    using System.Text;

    class DecToHex
    {
        static void Main(string[] args)
        {
            long num = 100000;
            Console.WriteLine(DecimalToHex(num)); // 186A0
        }

        private static string DecimalToHex(long num)
        {
            var res = new StringBuilder();
            while (num > 0)
            {
                var reminder = num % 16;
                if (reminder > 9)
                {
                    res.Insert(0, (char)(reminder + 55));
                }
                else
                {
                    res.Insert(0, reminder);
                }

                num /= 16;
            }

            return res.ToString();
        }
    }

How to convert decimal to binary number in C# using method

    using System;
    using System.Text;

    class DecToBin
    {
        static void Main(string[] args)
        {
            long num = int.MaxValue * 2L;
            Console.WriteLine(DecimalToBinary(num)); // 11111111111111111111111111111110
        }

        private static string DecimalToBinary(long num)
        {
            StringBuilder res = new StringBuilder();
            while (num > 0)
            {
                res.Insert(0, num % 2);
                num /= 2;
            }

            return res.ToString();
        }
    }