zoukankan      html  css  js  c++  java
  • 基本二叉树的接口

    基本二叉树的接口

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

  • 相关阅读:
    看《环太平洋》归来
    在Fedora8上安装MySQL5.0.45的过程
    在Win7上安装MySql5.2遇到Write configuration file的解决
    每一个问题都是一把锁
    Fedora8上Apache Httpd与Tomcat6初集成
    在Fedora8上的Tomcat上deploy一个war
    在Fedora8上配置Tomcat6.0.37
    在Fedora8上配置Apache Httpd
    在Fedora8上安装jdk-7u25-linux-i586.rpm的步骤
    Java继承中的几道面试题
  • 原文地址:https://www.cnblogs.com/wesson2019-blog/p/14721263.html
Copyright © 2011-2022 走看看