首页 > 编程语言 >C#(Java)将List集合构建成Tree树

C#(Java)将List集合构建成Tree树

时间:2023-01-06 00:33:43浏览次数:40  
标签:Java C# List Tree MyTreeNode Add new ID roots

C#(Java)将List集合构建成Tree树

子安树构建算法,可以通过空间换时间进一步优化速度

树结构的类

public class MyTreeNode
{
    public MyTreeNode(long? iD, long? parentId)
    {
        ID = iD;
        ParentId = parentId;
    }

    public long? ID { set; get; }
    public long? ParentId { set; get; }
    public MyTreeNode Parent { set; get; }
    public List<MyTreeNode> Children { set; get; }
}

构建数的方法

/// <summary>
/// 构建数
/// </summary>
/// <returns></returns>
public static List<MyTreeNode> BuildMenuTree(List<MyTreeNode> menus)
{
    List<MyTreeNode> roots = new List<MyTreeNode>(); // 根节点集合
    if (menus == null)
    {
        return roots;
    }
    List<MyTreeNode> children = new List<MyTreeNode>(); // 保存所有子节点
    // 查找所有的根节点
    foreach (var menu in menus)
    {
        bool isTop = true;
        foreach (var m in menus)
        {
            // 跳过自身节点
            if (m == menu || m.ID == menu.ID)
            {
                continue;
            }
            // 如果父ID是其他节点的ID,那么一定不是根节点
            if (menu.ParentId == m.ID)
            {
                isTop = false;
                break;
            }
        }
        if (isTop)
        {
            roots.Add(menu);
        }
        else
        {
            children.Add(menu);
        }
    }
    // 递归查找根节点
    if (children.Any())
    {
        // 对子节点求根节点
        var nextRoots = BuildMenuTree(children);
        // 设置根节点与子根节点引用关系
        foreach (var root in roots)
        {
            foreach (var nextRoot in nextRoots)
            {
                if (root.ID == nextRoot.ParentId)
                {
                    if (root.Children == null)
                    {
                        root.Children = new List<MyTreeNode>() { nextRoot };
                    }
                    else
                    {
                        root.Children.Add(nextRoot);
                    }
                    nextRoot.Parent = root;
                }
            }
        }
    }
    return roots;
}

测试一下

public static void Main()
{
    List<MyTreeNode> nodes = new List<MyTreeNode>();
    nodes.Add(new MyTreeNode(0, -1));
    nodes.Add(new MyTreeNode(1, 0));
    nodes.Add(new MyTreeNode(2, 0));
    nodes.Add(new MyTreeNode(3, -2));
    nodes.Add(new MyTreeNode(4, 1));
    nodes.Add(new MyTreeNode(5, 1));
    nodes.Add(new MyTreeNode(6, -2));
    nodes.Add(new MyTreeNode(7, 4));
    var roots = BuildMenuTree(nodes);
    p(roots);
}

// 打印
public static void p(List<MyTreeNode> roots, string pid = "")
{
    if (roots == null)
    {
        return;
    }
    foreach (var root in roots)
    {
        Console.WriteLine(pid + "-->" + root.ID);
        p(root.Children, pid + "-->" + root.ID);
    }
}

测试结果

标签:Java,C#,List,Tree,MyTreeNode,Add,new,ID,roots
From: https://www.cnblogs.com/muphy/p/17029253.html

相关文章

  • java 货物摆放 —— 蓝桥
    题目描述小蓝有一个超大的仓库,可以摆放很多货物。现在,小蓝有 nn 箱货物要摆放在仓库,每箱货物都是规则的正方体。小蓝规定了长、宽、高三个互相垂直的方向,每箱货物......
  • SpringBoot整合Caffeine(通过注解)
    一、了解缓存配置先来了解一下配置方法吧,SimpleCacheManager和CaffeineCacheManager配置的区别:SimpleCacheManager: 这种缓存管理器允许你在应用程序启动时通过配置......
  • (0106) 《【UVM】sequence 的启动方式》
    https://blog.csdn.net/Holden_Liu/article/details/102757625(2)https://blog.csdn.net/weixin_42147770/article/details/127899670(3)https://www.cnblogs.com/xuqing125/......
  • NERDtree 快捷键
    NERDtree操作指令ctrl+w+h光标focus左侧树形目录ctrl+w+l光标focus右侧文件显示窗口ctrl+w+w光标自动在左右侧窗口切换ctrl+w+r......
  • vue 中安装并使用echart
    本文为博主原创,转载请注明出处:1.安装echart依赖:安装命令: npminstallecharts--save在vscode的终端窗口进行执行,如图所示: 执行完之后,查看项目中......
  • LeetCode第 322 场周赛
    1.回环句回环句SolutionclassSolution{public:boolisCircularSentence(stringsentence){intn=sentence.size(),i=0;if(......
  • 初识MySQL(三)CRUD操作
    insert增加   update更新updateusersetage=23wherename='zhangsan';updateusersetage=age+1whereid=3; delete删除deletefr......
  • docker部署Jenkins
     进入jenkins容器查看安装内容dockerps 查看容器id获取id后 通过命令进入对应容器的命令行:dockerexec-itid号/bin/bash执行前配置1.Jenkins-manageJen......
  • 山泽Typec扩展坞M.2移动固态硬盘盒拓展 - 我的硬件配置
    ......
  • Tomcat拒绝服务攻击(CVE-2020-13935)
    漏洞简介CVE-2020-13935ApacheTomcat是美国阿帕奇(Apache)基金会的一款轻量级Web应用服务器。该程序实现了对Servlet和JavaServerPage(JSP)的支持。ApacheTomcat中的WebSo......