基本二叉树的接口
/// <summary>
/// 树的基本接口
/// </summary>
/// <typeparam name="T"></typeparam>
interface ITreeBase<T>
{
/// <summary>
/// 插入一个结点
/// </summary>
/// <param name="item">结点值</param>
void Insert(T item);
/// <summary>
/// 向树中插入元素数组
/// </summary>
/// <param name="collection">元素数组(默认层次顺序)</param>
void Insert(T[] collection);
/// <summary>
/// 向树中插入元素数列
/// </summary>
/// <param name="collection">元素列表(默认层次顺序)</param>
void Insert(List<T> collection);
/// <summary>
/// 删除结点
/// </summary>
/// <param name="item">结点值</param>
void Remove(T item);
/// <summary>
/// 是否包含元素项,true包含,false不存在
/// </summary>
/// <param name="item">元素项值</param>
/// <returns></returns>
bool Contains(T item);
/// <summary>
/// 执行中序遍历查找树中所有匹配的元素
/// </summary>
/// <param name="match">匹配谓词</param>
/// <returns>匹配的元素列表</returns>
IEnumerable<T> FindAll(Predicate<T> match);
/// <summary>
/// 清空树
/// </summary>
void Clear();
/// <summary>
/// 树结点按相应顺序(默认层次遍历)存储为数组
/// </summary>
/// <returns></returns>
T[] ToArray(TraversalMode mode = TraversalMode.LevelOrder);
/// <summary>
/// 树结点按相应顺序(默认层次遍历)存储为数列
/// </summary>
/// <returns></returns>
List<T> ToList(TraversalMode mode = TraversalMode.LevelOrder);
/// <summary>
/// 树的字符串表示
/// </summary>
/// <param name="mode"></param>
/// <returns></returns>
string ToString(TraversalMode mode);
/// <summary>
/// 层次枚举器
/// </summary>
/// <returns></returns>
IEnumerator<T> GetLevelOrderEnumerator();
/// <summary>
/// 前序枚举器
/// </summary>
/// <returns></returns>
IEnumerator<T> GetPreOrderEnumerator();
/// <summary>
/// 中序枚举器
/// </summary>
/// <returns></returns>
IEnumerator<T> GetInOrderEnumerator();
/// <summary>
/// 后序枚举器
/// </summary>
/// <returns></returns>
IEnumerator<T> GetPostOrderEnumerator();
}
其中,树的遍历模式有:
/// <summary>
/// 树的遍历模式
/// </summary>
public enum TraversalMode
{
/// <summary>
/// 层次顺序
/// </summary>
LevelOrder = 0,
/// <summary>
/// 中序
/// </summary>
InOrder = 1,
/// <summary>
/// 前序
/// </summary>
PreOrder = 2,
/// <summary>
/// 后序
/// </summary>
PostOrder = 3,
}
基本二叉树类的BinaryTreeBase实现,可很容易自己编写。
一般二叉树的实现
/// <summary>
/// 一般二叉树
/// </summary>
/// <typeparam name="T">结点数据类型</typeparam>
public class CustomBinaryTree<T> : BinaryTreeBase<T> where T : IComparable<T>
{
readonly Queue<BTNode<T>> _queue;
public CustomBinaryTree() : base()
{
_queue = new Queue<BTNode<T>>();
}
public override void Insert(T item)
{
var node = new BTNode<T>(item);
Count++;
_queue.Enqueue(node);
if (Count == 1)
{
Root = node;
}
else
{
var current = _queue.Peek();
if (Count % 2 == 0)
{
current.LeftChild = node;
}
else
{
current.RightChild = node;
}
// 添加右结点后,删除父结点
if (Count % 2 == 1)
{
_queue.Dequeue();
}
}
}
public override void Remove(T item)
{
var node = FindNode(Root, item);
// DOTO
}
public override void Clear()
{
_queue.Clear();
Count = 0;
}
public override BTNode<T> FindNode(BTNode<T> node, T item)
{
if (node == null || item.IsEqualTo(node.Data))
{
return node;
}
BTNode<T> rslt = null;
if (node.HasLeftChild)
{
rslt = FindNode(node.LeftChild, item);
}
if (rslt == null && node.HasRightChild)
{
rslt = FindNode(node.RightChild, item);
}
return rslt;
}
}
Demo
var arr = new char[] { 'A', 'B', 'C', 'D', 'E', '#', 'F', '#', '#', 'G' };
var tree = new CustomBinaryTree<char>();
foreach (var item in arr)
{
tree.Insert(item);
}
Console.WriteLine(tree.DrawTree());
Console.WriteLine($"树高:{tree.Height}");
var node = tree.FindNode('B');
if (node != null)
{
Console.WriteLine($"'B'高:{node.Height}");
}
node = tree.FindNode('E');
if (node != null)
{
Console.WriteLine($"'E'高:{node.Height}");
}
node = tree.FindNode('G');
if (node != null)
{
Console.WriteLine($"'G'高:{node.Height}");
}
Console.Write("层次显示:");
foreach (var item in tree.ToList())
{
if (item == '#') continue;
Console.Write(item + " ");
}
Console.WriteLine();
Console.Write("前序显示:");
var iter = tree.GetPreOrderEnumerator();
while (iter.MoveNext())
{
if (iter.Current == '#') continue;
Console.Write(iter.Current + " ");
}
Console.WriteLine();
Console.Write("中序显示:");
iter = tree.GetInOrderEnumerator();
while (iter.MoveNext())
{
if (iter.Current == '#') continue;
Console.Write(iter.Current + " ");
}
Console.WriteLine();
Console.Write("后序显示:");
iter = tree.GetPostOrderEnumerator();
while (iter.MoveNext())
{
if (iter.Current == '#') continue;
Console.Write(iter.Current + " ");
}
Console.WriteLine();
其中,二叉树的显示,可参考树的显示。
其他二叉树的扩展,比如二叉搜索树(BST)、高度平衡树(AVL)、红黑树(RBtree)、字典树(Trie)、区间树、B树等,可参考其他博客的内容。