DataStructuresCSharp/C#/Datastructures/BinaryTree/Tree.cs

122 lines
3.4 KiB
C#
Raw Normal View History

2022-04-14 16:26:06 +00:00
using C_.Datastructures.BinaryTree;
2022-04-04 20:36:04 +00:00
using System;
2022-04-14 16:26:06 +00:00
namespace C_.Datastructures.BinaryTree
2022-04-04 20:36:04 +00:00
{
internal class Tree<T> where T:IComparable
{
public TreeNode<T>? Root { get; set; }
2022-04-04 20:36:04 +00:00
public int Count { get; set; }
2022-04-13 20:08:58 +00:00
public static Tree<T> Create(){
2022-04-04 20:36:04 +00:00
//Create a new Tree with no Head
return new Tree<T>{
Root = null,
2022-04-04 20:36:04 +00:00
Count = 0
};
}
public static Tree<T> Create(T value){
2022-04-04 20:36:04 +00:00
//Create a new Tree with Head
return new Tree<T>{
Root = TreeNode<T>.Create(value)
2022-04-04 20:36:04 +00:00
};
}
public void Add(T value)
{//Add item to the correct position in the tree (Input cannot be null)
Count++;
if (Root == default)
{//If new node should become the root
Root = TreeNode<T>.Create(value);
return;
}
//Find position to insert
TreeNode<T> node = Root;
node = Descend(value, node)!;
if (value.CompareTo(node.Value) < 0)
{//Insert to left
node.Left = TreeNode<T>.Create(value);
return;
}
//Insert to right
node.Right = TreeNode<T>.Create(value);
return;
}
2022-04-14 16:26:06 +00:00
public TreeNode<T>? Find(T value)
2022-04-13 20:08:58 +00:00
{//Return true if the item can be found within the tree
if (Root == default || Root.Value!.Equals(default))
2022-04-14 16:26:06 +00:00
return default;
2022-04-13 20:08:58 +00:00
TreeNode<T>? current = Root;
while (current != default)
{
2022-04-13 20:08:58 +00:00
//Compare value at node to see if we are looking for the root item
if (current.Value!.Equals(value))
2022-04-14 16:26:06 +00:00
return current;
2022-04-13 20:08:58 +00:00
current = Traverse(value, current);
}
2022-04-14 16:26:06 +00:00
return default;
}
public TreeNode<T>? Min(TreeNode<T>? node)
{//Returns the Minimum node from a given subtree
if(node == default)
return default;
while(true){
if (node!.Left == default)
return node;
node = node.Left;
}
}
public TreeNode<T>? Max(TreeNode<T>? node)
{//Returns the Minimum node from a given subtree
if(node == default)
return default;
while(true){
if (node!.Right == default)
return node;
node = node.Right;
}
}
2022-04-13 20:08:58 +00:00
private TreeNode<T>? Traverse(T value, TreeNode<T> node)
{//T is comparable so use methods to determine which way to traverse
if(node == default)
return default;
if (value.CompareTo(node.Value) < 0)
{//Traverse Left
return node.Left;
}
//Traverse Right
return node.Right;
}
private TreeNode<T>? Descend(T value, TreeNode<T>? current)
{//Keep trying to determine whether to go left or right until null node is found that can be appended to
if (current == default)
return default;
TreeNode<T>? node;
node = Descend(value, Traverse(value, current));
if (node == null)
{
return current;
}
return node;
}
2022-04-04 20:36:04 +00:00
}
}