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);
}
}
Tag: data structure
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);
}
}