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