国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

C#樹類型及其遍歷

2019-11-14 14:01:07
字體:
來源:轉載
供稿:網友

最近有個項目不僅需要取部門的層級關系,還要處理不規則的關系(移除某個部門),只有樹結構才能實現相關遍歷和操作。

涉及到的知識點:泛型、遞歸、數據結構

既然研究樹類型就先來看下樹的定義:

一棵樹(tree)是由n(n>0)個元素組成的有限集合,其中:

(1)每個元素稱為結點(node);

(2)有一個特定的結點,稱為根結點或根(root);

(3)除根結點外,其余結點被分成m(m>=0)個互不相交的有限集合,而每個子集又都是一棵樹(稱為原樹的子樹);——百度

本文將簡化樹,只研究樹的結點-結點樹。結點樹包含:父結點(根結點的父結點為null)、子結點(List集合)、數據對象。

 

類的設計:

public class BoTree<T>    {        public BoTree()        {            nodes = new List<BoTree<T>>();        }        public BoTree(T data)        {            this.Data = data;            nodes = new List<BoTree<T>>();        }        PRivate BoTree<T> parent;        /// <summary>        /// 父結點        /// </summary>        public BoTree<T> Parent        {            get { return parent; }        }        /// <summary>        /// 結點數據        /// </summary>        public T Data { get; set; }        private List<BoTree<T>> nodes;        /// <summary>        /// 子結點        /// </summary>        public List<BoTree<T>> Nodes        {            get { return nodes; }        }        /// <summary>        /// 添加結點        /// </summary>        /// <param name="node">結點</param>        public void AddNode(BoTree<T> node)        {            if (!nodes.Contains(node))            {                node.parent = this;                nodes.Add(node);            }        }        /// <summary>        /// 添加結點        /// </summary>        /// <param name="nodes">結點集合</param>        public void AddNode(List<BoTree<T>> nodes)        {            foreach (var node in nodes)            {                if (!nodes.Contains(node))                {                    node.parent = this;                    nodes.Add(node);                }            }        }        /// <summary>        /// 移除結點        /// </summary>        /// <param name="node"></param>        public void Remove(BoTree<T> node)        {            if (nodes.Contains(node))                nodes.Remove(node);        }        /// <summary>        /// 清空結點集合        /// </summary>        public void RemoveAll()        {            nodes.Clear();        }    }

測試:

首先創建一個學生類(任意)

public class Student    {        public Student(string name, string sex, int age)        {            this.Name = name;            this.Sex = sex;            this.Age = age;        }        public string Name { get; set; }        public string Sex { get; set; }        public int Age { get; set; }    }

初始化樹:

BoTree<Student> tree1 = new BoTree<Student>();tree1.Data = new Student("小波1", "", 18);BoTree<Student> tree2 = new BoTree<Student>();tree2.Data = new Student("小波2", "", 19);BoTree<Student> tree3 = new BoTree<Student>();tree3.Data = new Student("小波3", "", 20);BoTree<Student> tree4 = new BoTree<Student>();tree4.Data = new Student("小波4", "", 21);tree1.AddNode(tree2);tree1.AddNode(tree3);tree3.AddNode(tree4);

調試:

可以從監視中看出tree1有2個子結點

可以看出tree4的父結點為tree3

下面我們來遍歷這棵樹:

public static void Recursive(BoTree<Student> tree)        {            Console.WriteLine("姓名:{0},姓名:{1},年齡:{2}", tree.Data.Name, tree.Data.Sex, tree.Data.Age);            if (tree.Nodes.Count > 0)            {                foreach (var item in tree.Nodes)                {                    Recursive(item);                }            }        }

調用結果:

需要說明的是:不要嘗試用Nodes.Add(T item)來添加結點,而是用AddNode方法來添加結點。AddNode方法將對Parent進行賦值,保證了父結點可查詢

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 嵩明县| 外汇| 五指山市| 中西区| 富阳市| 湘潭县| 佛坪县| 咸阳市| 辰溪县| 钟山县| 阳东县| 万全县| 凭祥市| 托克逊县| 延长县| 子洲县| 阳山县| 上饶县| 大英县| 田林县| 溧阳市| 长治市| 乐亭县| 杨浦区| 澎湖县| 英德市| 古交市| 石泉县| 高清| 恩平市| 房产| 新丰县| 万宁市| 南溪县| 锡林浩特市| 昆山市| 武清区| 文登市| 庆元县| 若羌县| 珲春市|