tree状数据叶子节点与根节点等的递归转换

做项目时经常遇到树状层级数据。从各个层级数据的转换查询等。场景如行业类别的多层级,行政区层级,检查项类别层级等等。

数据结构如  Id Name ParentId

 #region area树状节点的转化

        public List<Area> ConvertToLeafChildAreas(List<int> areaIds)
        {
            var allAreas = GetNewAreas().ToList();
            List<Area> leafChildren = new List<Area>();
            foreach (var areaId in areaIds)
            {
                leafChildren.AddRange(GetLeafChildAreas(areaId, allAreas));
            }
            return leafChildren;
        }

        /// <summary>
        /// 根据父ID获取所有的最小地区
        /// </summary>
        /// <param name="parentId"></param>
        /// <param name="allAreas"></param>
        /// <returns></returns>
        public List<Area> GetLeafChildAreas(int parentId,List<Area> allAreas)
        {
            List<Area> leafChildren = new List<Area>();
            var sons = allAreas.Where(o => o.ParentId == parentId).ToList();
            if (sons.Any())
            {
                foreach (var item in sons)
                {
                    leafChildren.AddRange(GetLeafChildAreas(item.Id, allAreas));
                }
            }
            else
            {
                var currentArea = allAreas.FirstOrDefault(m=>m.Id== parentId);
                leafChildren.Add(currentArea);
            }
            return leafChildren;
        }

        public List<Area> ConvertToRootAreas(List<int> childAreaIds)
        {
            var allAreas = GetNewAreas().ToList();
            var childAreas = allAreas.Where(m => childAreaIds.Contains(m.Id)).ToList();
            List<Area> root = new List<Area>();
            foreach (var childArea in childAreas)
            {
                root.Add(GetRootArea(childArea, allAreas));
            }
            return root.Distinct().ToList();
        }
        /// <summary>
        /// 根据子ID获取所有的最顶级地区
        /// </summary>
        /// <param name="childArea"></param>
        /// <param name="allAreas"></param>
        /// <returns></returns>
        public Area GetRootArea(Area childArea, List<Area> allAreas)
        {
            var parentArea = allAreas.FirstOrDefault(o => o.Id == childArea.ParentId);
            if (parentArea==null) return childArea;
            return GetRootArea(parentArea,allAreas);
        }
        #endregion

  

原文地址:https://www.cnblogs.com/taoshengyujiu/p/10061819.html

时间: 2024-07-31 13:21:28

tree状数据叶子节点与根节点等的递归转换的相关文章

设计一个算法,输出从每个叶子节点到根节点的逆路径

下面使用三种遍历方法输出逆路径,假设二叉树采用二叉链存储结构存储. 方法1:采用基于层次遍历的方法,设计的队列为非环形顺序队列,将所有已扫描的节点指针进队,并在队列中保存双亲节点的位置.当找到一个叶子节点时,在队列中通过双亲节点的位置输出该叶子节点到根节点的逆路径.对应的算法如下: void AllPath(BTNode * b) { struct snode { BTNode *node; //存放当前节点指针 int parent; //存放双亲节点在队列中的位置 } Qu[MaxSize]

第4章第1节练习题12 删除以指定节点为根节点的所有子树

问题描述 已知二叉树以二叉链表存储,编写算法完成对于树中每一个元素值为x的节点,删去以它为根的子树,并释放相应空间 算法思想 本题可以分成两个部分来完成.第一步:查找值为x的节点:第二步:删除以值为x的节点为根节点的所有子树: 因为删除的是x的所有子树,因此遍历方式应该选择自上而下的遍历方式,即先序遍历或层次遍历方式,这里选择层次遍历的方式实现. 删除值为x的节点的所有子树,可以考虑使用递归的方式: 即此时可以认为删除的是以值为x的节点作为根节点的树: 首先删除该树的叶子节点,这样该树的倒数第二

(DS 《算法竞赛入门经典》)LA 3027 Corporative Network(查询某一个节点到根节点之间的距离)

题目大意: 查询某一个节点到根节点之间的距离 解题思路: 加权并查集问题.之前做的题目是"查看两个或多个节点是否在同一个集合下",现在的题目是"查询某个节点到 根节点之间的距离".之前只需要使用到father[x]这个数组,用来表示x的父亲节点是谁.现在引入dist[x]数组,用来记录 x节点到根节点的距离 1)在并查集中,根节点不懂,其他节点都可以动. A very big corporation is developing its corporative net

C#中treeview的问题,如何区分根节点和子节点以及根节点和根节点的兄弟节点?

根节点的Level属性为0,一级子节点Level属性为1,二级子节点Level属性为2,以此类推:同级节点可以用索引.名称.文本来区分.用索引区分根节点时,TreeView.Nodes[0]就是第一个根节点,TreeView.Nodes[1]就是第二个根节点,以此类推:用索引区分一级子节点时,TreeView.Nodes[0].Nodes[0]为第一个根节点的第一个子节点,TreeView.Nodes[0].Nodes[1]是第一个根节点的第二个子节点,以此类推: 2.如何获取TreeView点

【转】oracle CONNECT BY PRIOR叶子节点查找根节点

SELECT TRANS_ID FROM TRANS_INST WHERE connect_by_isleaf=1 START WITH TRANS_ID =480242 CONNECT BY PRIOR UP_TRANS_ID = TRANS_ID; 说明: 表TRANS_INST(TRANS_ID,UP_TRANS_ID) 480242表示树的任何一个节点 TRANS_ID子节点 UP_TRANS_ID父节点

asp.net 实现treeview 选中父节点其子节点也选种中 选中子节点其父节点与根节点也被选中

1.在 Page_Load(object sender, EventArgs e) 里面加入: TreeView1.Attributes.Add("onclick", "CheckEvent(event)");//TreeView1是树控件的名称. javascript 放到 <head></head> 之间 <script type="text/javascript"> <head runat=&quo

easyui中combotree循环获取父节点至根节点并输出路径

前台页面: <pre name="code" class="html"><td style="height: 35px" colspan="7">   <input id="fm_AEType" class="easyui-combotree" style="width: 240px" />   <label id="

LA 3027 Corporative Network(并查集,求某个节点到根节点的距离)

A very big corporation is developing its corporative network. In the beginning each of the N enterprisesof the corporation, numerated from 1 to N, organized its own computing and telecommunication center.Soon, for amelioration of the services, the co

xml文件的根节点layout_width或者layout_height设置无效果的原因分析

在android开发中相信大家对ListView.GridView等组建都很熟悉,在使用它们的时候需要自己配置相关的Adapter,并且配置现骨干的xml文件作为ListView等组建的子View,这些xml文件在Adapter的getView方法中调用.例如: public View getView(int position, View convertView, ViewGroup parent) { if(convertView==null) { convertView = App.getL