基本二叉树的接口

基本二叉树的接口

/// <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树等,可参考其他博客的内容。

posted @ 2021-04-30 11:04  wesson2019  阅读(80)  评论(0编辑  收藏  举报