zoukankan      html  css  js  c++  java
  • 【算法】非递归的方式生成树

    【算法】非递归的方式生成树

     一种不同方式来生成树,感觉蛮有意思的,在此记录

     public class TreeServices
        {
            /// <summary>
            /// 以非递归的方式生成树
            /// </summary>
            /// <param name="table"></param>
            /// <returns></returns>
            public static List<TreeNode> ToTree(DataTable table)
            {
                var list = new List<TreeNode>();
                if (table.IsEmpty()) return list;
                var dic = TreeNode.FillModel(table);
                foreach (var pair in dic)
                {
                    var pid = pair.Value.ParentId;
                    if (pid == 0)
                    {
                        list.Add(pair.Value);
                        continue;
                    }
                    if (dic.ContainsKey(pid))
                    {
                        dic[pid].Children.Add(pair.Value);
                    }
                }
                return list;
            }
        }
    
        public class TreeNode
        {
            public TreeNode()
            {
                Children = new List<TreeNode>();
            }
    
            /// <summary>
            /// 自增Id
            /// </summary>
            public int NodeId { get; set; }
    
            /// <summary>
            /// 关联Id,形式1-2-3-4(该节点上一节点为4,再上一级为3,...)
            /// </summary>
            public string RelationId { get; set; }
    
            /// <summary>
            /// 上一个节点的Id
            /// </summary>
            public int ParentId
            {
                get
                {
                    if (RelationId.IsEmpty()) return 0;
                    var s = RelationId.Split('-');
                    return s[s.Length - 1].ToInt32();
                }
            }
    
            /// <summary>
            /// 是否有下一节点
            /// </summary>
            public bool HasChild
            {
                get { return Children.IsEmpty(); }
            }
    
            /// <summary>
            /// 子节点集合
            /// </summary>
            public List<TreeNode> Children { get; set; }
    
            /// <summary>
            /// DataTable To Dictionary
            /// </summary>
            /// <param name="table"></param>
            /// <returns></returns>
            public static Dictionary<int, TreeNode> FillModel(DataTable table)
            {
                var list = new Dictionary<int, TreeNode>();
                if (table == null || table.Rows.Count == 0) return list;
                foreach (DataRow row in table.Rows)
                {
                    var model = new TreeNode
                    {
                        NodeId = row["Id"].ToInt32(),
                        RelationId = row["RelationId"].ToString()
                    };
                    list.Add(model.NodeId, model);
                }
                return list;
            }
        }
  • 相关阅读:
    Python安装(小白教程)中文版Pycharm
    二叉树遍历1
    node* p 和 node *p 和 node * p 的区别
    WinForm中的ListBox组件编程
    C# winform listBox中的项上下移动(转)
    C# ListBox 左移、右移、上移、下移
    C#上移,下移TreeView中的树节点顺序
    C#遍历DataSet与DataSet元素实现代码
    C# 手动编写 DataSet,DataTable 及遍历DataSet中的数据
    【.NET】C#中遍历各类数据集合的方法
  • 原文地址:https://www.cnblogs.com/fzz2727551894/p/5501223.html
Copyright © 2011-2022 走看看