亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

淺談二叉查找樹的集合總結分析

2020-01-24 03:16:32
字體:
來源:轉載
供稿:網友
我們都知道Dictionary<TKey, TValue>查找元素非???,其實現原理是:將你TKey的值散列到數組的指定位置,將TValue的值存入對應的位置,
由于取和存用的是同一個算法,所以就很容易定位到TValue的位置,花費的時間基本上就是實現散列算法的時間,跟其中元素的個數沒有關系,故取值的時間復雜度為O(1)。
集合無非都是基于最基礎語法的數組[],先欲分配,然后向其中添加元素,容量不夠就創建一個2倍容量的數組,將之前的元素賦值過來,將之前的數組回收,
但基于散列算法的集合這點上有點不同,他并不是每次創建一個2倍容量的數組,為了讓元素均勻的分布到數組上,數組的容量是這么增長的:3,7,11,17,23,29,37,47,59,71,89,107,131,163,197,239,293,353,431,521,631,761,919,1103...
以質數的方式增長。由于每次擴充數組的容量較小,如果要向其中添加很多元素的話,程序員又沒有預先分配內存,那就會出現多次數組的創建、復制和回收。
一直想做個有用的東西出來,讓想用的人用,又能讓自己練練手,于是這次做了一個基于二叉查找樹的集合,我們知道在二叉查找樹中查詢元素的最優時間復雜度是O(logN)即在滿二叉樹的情況下,最壞時間復雜度是O(n)即除葉子節點外每個節點只有一個子節點,
查找元素它也是很快的哦,而且查找的時候都只是做Int型的比較,而Dictionary<TKey, TValue>是基于一個散列算法,當然基于二插查找樹的集合也有自身的缺點:
1:元素必須實現接口IBinaryTree,其屬性CompareValue主要用于比較生成二叉查找樹
2:元素必須是可以new的,即不支持基礎類型int,char,string等
3:每個節點都有左右兩個子節點,他們只是起到指針的作用,指向該節點的子節點,只需占用額外的少量內存
4:基本上都是基于遞歸實現,元素過多的話,會棧溢出
優點是常用的一些功能都有,功能如下,練手嗎,但會一直優化下去
復制代碼 代碼如下:

public class BinaryTree<T> : IDisposable, IEnumerable<T>, IEnumerable where T :IBinaryTree, new()
    {
        public BinaryTree();
        public BinaryTree(IEnumerable<T> list);//將一個數組構造成二插查找樹
        public BinaryTree(T root); //指定跟節點
        public int Count { get; }//元素個數
        public T this[IBinaryTree iBinaryTree] { get; }//數組索引直接訪問元素
        public void Add(T t);//添加元素
        public void Clear();//清除所有元素
        public bool Contains(T iBinaryTree);//是否包含自定元素
        public void Dispose();//釋放資源,支持using
        public T Find(IBinaryTree iBinaryTree);//查找元素
        public T Find(IBinaryTree iBinaryTree, TreeNode<T> node);//在指定的節點下查找元素
        public T FindMax();//最大元素
        public T FindMin();//最小元素
        public T FindMin(TreeNode<T> node);//在指定的節點下查找最小元素
        public IEnumerator<T> GetEnumerator();//返回所有元素,支持foreach
        public TreeNode<T> Remove(T t);//刪除元素
        public TreeNode<T> Remove(IBinaryTree iBinaryTree, TreeNode<T> node);//在指定的節點下刪除元素
        public IEnumerable<T> Sort();//排序(升序)
        public IEnumerable<T> ToList();//返回所有元素
    }

復制代碼 代碼如下:

源碼
namespace Utils
{
    /// <summary>
    /// 二叉樹接口
    /// </summary>
    public interface IBinaryTree
    {
        /// <summary>
        /// 用于比較的值
        /// </summary>
        int CompareValue
        {
            get;
            set;
        }
    }
    public class TreeNode<T> where T : IBinaryTree, new()
    {
        public TreeNode<T> Left
        {
            get;
            set;
        }
        public TreeNode<T> Right
        {
            set;
            get;
        }
        public T Data
        {
            get;
            set;
        }
        public TreeNode(T t)
        {
            this.Data = t;
        }
        public TreeNode()
            : this(default(T))
        {
        }
    }
    /// <summary>
    /// 二插查找樹
    /// </summary>
    public class BinaryTree<T> : IDisposable,IEnumerable<T> where T : IBinaryTree, new()
    {
        public BinaryTree()
        {

        }
        public BinaryTree(T root)
        {
            if (root == null)
            {
                throw new NullReferenceException("Parameter is null");
            }
            Add(root);
        }
        public BinaryTree(IEnumerable<T> list)
        {
            if (list == null)
            {
                throw new NullReferenceException("Parameter is null");
            }
            foreach (var item in list)
            {
                Add(item);
            }
        }
        //根節點
        private TreeNode<T> root;
        //添加節點(沒有檢查根節點是否為空,所以設為private)
        private void Add(T t, TreeNode<T> root)
        {
            if (t == null)
            {
                return;
            }
            if (t.CompareValue < root.Data.CompareValue)
            {
                if (root.Left == null)
                {
                    root.Left = new TreeNode<T>(t);
                    ++Count;
                }
                else
                {
                    Add(t, root.Left);
                }
            }
            else if (t.CompareValue > root.Data.CompareValue)
            {
                if (root.Right == null)
                {
                    root.Right = new TreeNode<T>(t);
                    ++Count;
                }
                else
                {
                    Add(t, root.Right);
                }
            }
            else
            {
                root.Data = t;
            }
        }
        //添加節點
        public void Add(T t)
        {
            if (t == null)
            {
                return;
            }
            if (this.root == null)
            {
                this.root = new TreeNode<T>(t);
                ++Count;
            }
            else
            {
                Add(t, this.root);
            }
        }
        //查找指定節點下的最小節點
        public T FindMin(TreeNode<T> node)
        {
            if (node == null)
            {
                return default(T);
            }
            if (node.Left == null)
            {
                return node.Data;
            }
            else
            {
                return FindMin(node.Left);
            }
        }
        //查找最小節點
        public T FindMin()
        {
            return FindMin(this.root);
        }
        //查找最大節點
        private T FindMax(TreeNode<T> node)
        {
            if (node.Right == null)
            {
                return node.Data;
            }
            else
            {
                return FindMax(node.Right);
            }
        }
        //查找最大節點
        public T FindMax()
        {
            return FindMax(this.root);
        }
        //刪除指定節點下的節點
        public TreeNode<T> Remove(IBinaryTree iBinaryTree, TreeNode<T> node)
        {
            if (node == null)
            {
                return null;
            }
            if (iBinaryTree == null)
            {
                return node;
            }
            if (iBinaryTree.CompareValue < node.Data.CompareValue)
            {
                node.Left = Remove(iBinaryTree, node.Left);
            }
            else if (iBinaryTree.CompareValue > node.Data.CompareValue)
            {
                node.Right = Remove(iBinaryTree, node.Right);
            }
            else
            {
                if (node.Left != null && node.Right != null)
                {
                    T tmpNode = FindMin(node.Right);//查找當前節點有子樹的最小節點
                    node.Data.CompareValue = tmpNode.CompareValue;//將右子樹的最小節點取代當前要刪除的節點
                    node.Right = Remove(tmpNode, node.Right);//這里是亮點,刪除當前節點右子樹的最小節點
                }
                else
                {
                    if (node.Left == null)
                    {
                        node = node.Right;
                    }
                    else if (node.Right == null)
                    {
                        node = node.Left;
                    }
                    else
                    {
                        node = null;
                    }
                    if (this.root.Data.CompareValue == iBinaryTree.CompareValue)//處理根節點
                    {
                        this.root = node;
                    }
                }
                --Count;
            }
            return node;
        }
        //刪除節點
        public TreeNode<T> Remove(T t)
        {
            if (this.root == null || t==null)
            {
                return null;
            }
            return Remove(t, this.root);
        }
        //查找節點
        public T Find(IBinaryTree iBinaryTree, TreeNode<T> node)
        {
            if (node == null || iBinaryTree == null)
            {
                return default(T);
            }
            if (iBinaryTree.CompareValue < node.Data.CompareValue)
            {
                return Find(iBinaryTree, node.Left);
            }
            else if (iBinaryTree.CompareValue > node.Data.CompareValue)
            {
                return Find(iBinaryTree, node.Right);
            }
            return node.Data;
        }
        //查找節點
        public T Find(IBinaryTree iBinaryTree)
        {
            return Find(iBinaryTree, this.root);
        }
        //是否包含指定元素
        private bool Contains(IBinaryTree iBinaryTree, TreeNode<T> node)
        {
            if (node == null || iBinaryTree == null)
            {
                return false; ;
            }
            if (iBinaryTree.CompareValue < node.Data.CompareValue)
            {
                return Contains(iBinaryTree, node.Left);
            }
            else if (iBinaryTree.CompareValue > node.Data.CompareValue)
            {
                return Contains(iBinaryTree, node.Right);
            }
            return iBinaryTree.Equals(node.Data);
        }
        //是否包含指定元素
        public bool Contains(T iBinaryTree)
        {
            return Contains(iBinaryTree, this.root);
        }
        //清除所有節點
        public void Clear()
        {
            while (this.Count > 0)
            {
                Remove(this.root.Data);
            }
            this.root = new TreeNode<T>();
        }
        //釋放資源
        public void Dispose()
        {
            while (this.Count > 0)
            {
                Remove(this.root.Data);
            }
            this.root = null;
        }
        //節點個數
        public int Count
        {
            private set;
            get;
        }
        //轉換成集合
        public IEnumerable<T> ToList()
        {
            IList<T> list = new List<T>(Count);
            LCR(this.root,list);
            return list;
        }
        //以前序遍歷的方式將節點加入集合,用遞歸實現,如果元素很多可能會出現棧溢出
        private void LCR(TreeNode<T> node, IList<T> list)
        {
            if (node == null)
            {
                return;
            }
            if (node.Left != null)
            {
                LCR(node.Left, list);
            }
            list.Add(node.Data);//添加元素
            if (node.Right != null)
            {
                LCR(node.Right, list);
            }
        }
        //排序
        public IEnumerable<T> Sort()
        {
            return ToList();
        }
        //返回一個循環訪問集合的枚舉數
        public IEnumerator<T> GetEnumerator()
        {
            return this.ToList().GetEnumerator();
        }
        //返回一個循環訪問集合的枚舉數
        IEnumerator IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
        public T this[IBinaryTree iBinaryTree]
        {
            get {
                return this.Find(iBinaryTree);
            }
        }

    }
    public class Node : IBinaryTree
    {
        /// <summary>
        /// 用于比較的值
        /// </summary>
        public int CompareValue
        {
            get;
            set;
        }
        public string Name
        {
            get;
            set;
        }
        public override string ToString()
        {
            return string.Format("CompareValue:{0},Name:{1}", this.CompareValue, this.Name);
        }
    }
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲第一区第二区| 亚洲国产成人久久综合一区| 大桥未久av一区二区三区| 欧美在线观看视频| 日韩美女av在线| 萌白酱国产一区二区| 97久久精品视频| 性欧美在线看片a免费观看| 668精品在线视频| 51ⅴ精品国产91久久久久久| 久久频这里精品99香蕉| 欧美精品少妇videofree| 国产免费一区二区三区在线能观看| 日韩福利在线播放| 国产视频亚洲视频| 97国产精品人人爽人人做| 亚洲精品视频二区| 日韩免费视频在线观看| 欧美性xxxxx| 亚洲激情久久久| 欧美疯狂性受xxxxx另类| 最近中文字幕日韩精品| 国产午夜精品一区二区三区| 欧美最猛黑人xxxx黑人猛叫黄| 91精品国产免费久久久久久| 亚洲女同性videos| 26uuu另类亚洲欧美日本一| 国产精品免费久久久| 4444欧美成人kkkk| 亚洲天堂第二页| 国产成人欧美在线观看| 国产精品视频xxxx| 亚洲国产精品久久91精品| 欧美中文在线字幕| 好吊成人免视频| 国产精品久久不能| 欧美激情视频在线免费观看 欧美视频免费一| 久久国产精品久久精品| 成人在线精品视频| 国产精品揄拍500视频| 亚洲国产欧美一区二区丝袜黑人| 久久久免费观看视频| 日韩欧美中文字幕在线观看| 欧美丰满少妇xxxxx做受| 欧美大秀在线观看| 久久久午夜视频| 亚洲人精选亚洲人成在线| 亚洲一区二区国产| 成人午夜小视频| 日韩av一区在线观看| 欧美性猛交xxxx偷拍洗澡| 久久成人这里只有精品| 亚洲国产一区二区三区四区| 亚洲国产精品va在看黑人| 欧洲成人性视频| 国产免费成人av| 亚洲欧美成人在线| 国产精品aaa| 97人人爽人人喊人人模波多| 国产精品∨欧美精品v日韩精品| 久久精品视频导航| 欧美性videos高清精品| 亚洲精品久久久久久久久久久久久| 欧美日韩在线另类| 欧美成人午夜激情在线| 国产成人精品国内自产拍免费看| 国产精品一区专区欧美日韩| 激情懂色av一区av二区av| 26uuu亚洲伊人春色| 亚洲精品电影久久久| 亚洲a∨日韩av高清在线观看| 91亚洲va在线va天堂va国| 亚洲精品视频久久| 久久精品视频在线播放| 欧美午夜精品伦理| 日韩av最新在线| 日韩在线视频一区| 欧美日韩日本国产| 色噜噜狠狠狠综合曰曰曰| 久久久久久久国产精品视频| 午夜精品久久久久久久99黑人| 欧美一区二区影院| 另类少妇人与禽zozz0性伦| 欧美国产第二页| 久久九九亚洲综合| 色伦专区97中文字幕| 国产亚洲视频在线| 久久久av免费| 成人精品视频99在线观看免费| 日韩小视频网址| www亚洲欧美| 97在线视频精品| 精品国产乱码久久久久酒店| 久久韩剧网电视剧| 国产在线精品成人一区二区三区| 亚洲欧美日韩视频一区| 亚洲成人黄色在线观看| 91在线观看免费高清完整版在线观看| 亚洲电影免费观看高清| 亚洲午夜av久久乱码| 日韩资源在线观看| 久久在线视频在线| 国产精品吹潮在线观看| 日韩在线免费av| 国产一区二区丝袜高跟鞋图片| 国产精品永久免费| 久久国产一区二区三区| 欧美日韩激情美女| 91久久精品在线| 97成人精品区在线播放| 国产亚洲精品久久久久动| 国产极品jizzhd欧美| 91在线直播亚洲| 国产丝袜高跟一区| 中文字幕欧美日韩在线| 亚洲最大的成人网| 精品亚洲一区二区| 日韩精品极品在线观看| 97视频免费在线看| 欧美成人全部免费| 亚洲三级 欧美三级| 97精品免费视频| 福利二区91精品bt7086| 中文字幕在线看视频国产欧美| 亚洲va久久久噜噜噜久久天堂| 久久久97精品| 在线看欧美日韩| 国产精品欧美激情| 亚洲性日韩精品一区二区| 日韩精品免费在线观看| 97国产suv精品一区二区62| 狠狠躁夜夜躁人人爽超碰91| 成人精品久久av网站| 亚洲国产欧美在线成人app| 欧美性高潮在线| 国产精品揄拍500视频| 亚洲人线精品午夜| 日韩精品一区二区三区第95| 亚洲激情视频网| 欧美日韩亚洲一区二区三区| 久久久精品国产亚洲| 久久人91精品久久久久久不卡| 国产日韩欧美夫妻视频在线观看| 欧美视频中文字幕在线| 欧美激情在线一区| 国产精品久久久久久久久久三级| 精品国内产的精品视频在线观看| 亚洲国产高清自拍| 国产精品大陆在线观看| 国产精品18久久久久久麻辣| 成人激情在线观看| 国产狼人综合免费视频| 一区二区三区视频观看| 国产丝袜一区二区三区免费视频| 精品国内自产拍在线观看| 成人中文字幕在线观看| 中文字幕亚洲欧美一区二区三区| 国产精品视频一区国模私拍| 国产午夜精品理论片a级探花| 福利一区视频在线观看| 国产精品一区av| 热久久美女精品天天吊色| 2019精品视频| 91精品综合久久久久久五月天|