原理讲解

利用引用传递,当儿子的儿子变动的时候,自己的儿子的儿子也变动(取地址)

java demo

package com.huiyuan.algorithm;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors; public class Tree {
public static void main(String[] args) {
List<TreeDto> treeDtoList = new ArrayList<>() {{
add(new TreeDto(1, 0, "111"));
add(new TreeDto(3, 2, "333"));
add(new TreeDto(2, 1, "222"));
add(new TreeDto(4, 2, "444"));
}}; Map<Integer, TreeDto> treeDtoMap = treeDtoList.stream().collect(Collectors.toMap(TreeDto::getId, Function.identity())); for (Map.Entry<Integer, TreeDto> entry : treeDtoMap.entrySet()) {
int pid = entry.getValue().getPid(); if(treeDtoMap.containsKey(pid)){
if(treeDtoMap.get(pid).getChildren() == null){
treeDtoMap.get(pid).setChildren(new ArrayList<>());
} treeDtoMap.get(pid).getChildren().add(entry.getValue());
}
} System.out.println(treeDtoMap);
}
} class TreeDto {
private int id;
private int pid;
private String name;
private List<TreeDto> children; @Override
public String toString() {
return "TreeDto{" +
"id=" + id +
", pid=" + pid +
", name='" + name + '\'' +
", children=" + children +
'}';
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public List<TreeDto> getChildren() {
return children;
} public void setChildren(List<TreeDto> children) {
this.children = children;
} public int getId(){
return this.id;
} public int getPid(){
return this.pid;
} public TreeDto(int id, int pid, String name) {
this.id = id;
this.pid = pid;
this.name = name;
}
}

Go demo

package main

import "fmt"

type treeDto struct {
Id int32
Pid int32
Name string
Children []*treeDto
} func main() {
treeDtoMap := make(map[int32]*treeDto) treeDtoMap[1] = &treeDto{
Id: 1,
Pid: 0,
Name: "111",
} treeDtoMap[4] = &treeDto{
Id: 4,
Pid: 2,
Name: "444",
} treeDtoMap[2] = &treeDto{
Id: 2,
Pid: 1,
Name: "222",
} treeDtoMap[3] = &treeDto{
Id: 3,
Pid: 2,
Name: "333",
} for _, tree := range treeDtoMap {
pid := tree.Pid if _, ok := treeDtoMap[pid]; ok {
treeDtoMap[pid].Children = append(treeDtoMap[pid].Children, tree)
}
} fmt.Println(treeDtoMap)
}

优点

  • 时间复杂度为O(n),亲测可支持几百万的节点树
  • 过程中产生的副产品,在getChildren()的时候可以直接获取

利用引用传递一次遍历构造菜单树(附java&go demo)的更多相关文章

  1. [Leetcode] Construct binary tree from preorder and inorder travesal 利用前序和中续遍历构造二叉树

    Given preorder and inorder traversal of a tree, construct the binary tree. Note:  You may assume tha ...

  2. [Leetcode] Construct binary tree from inorder and postorder travesal 利用中序和后续遍历构造二叉树

    Given inorder and postorder traversal of a tree, construct the binary tree. Note:  You may assume th ...

  3. 前序遍历构造已知二叉树(Java)

    public BiNode createBiTree() { Scanner input = new Scanner(System.in); int k = input.nextInt(); if(k ...

  4. 关于java是值传递还是引用传递

    一.概念 实际上对这两种传递方式,知乎上有个回答说得很好: 值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递 ...

  5. java只有值传递,不存在引用传递

    今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...

  6. 解惑4:java是值传递还是引用传递

    一.概述 曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:"传参数就是值传递,传对象就是引用传递",后面进一步查找了相关资料和文章以后, ...

  7. 面试官问:Go 中的参数传递是值传递还是引用传递?

    一个程序中,变量分为变量名和变量内容,变量内容的存储一般会被分配到堆和栈上.而在 Go 语言中有两种传递变量的方式值传递和引用传递.其中值传递会直接将变量内容附在变量名上传递,而引用传递会将变量内容的 ...

  8. 通过有序线性结构构造AVL树

    通过有序线性结构构造AVL树 本博客旨在结局利用有序数组和有序链表构造平衡二叉树(下文使用AVL树代指)问题. 直接通过旋转来构造AVL树似乎是一个不错的选择,但是稍加分析就会发现,这样平白无故做了许 ...

  9. Java基础_0310:引用传递

    引用传递 引用传递是Java之中最让初学者费解的概念,而在实际的开发之中,引用传递又有着非常重要的作用: 引用传递的核心在于同一块堆内存空间被不同的栈内存所指向: 范例:第一道引用传递范例 class ...

  10. c/c++值传递和引用传递

    今天看数据结构的时候,因为是c语言版的,刚开始学的时候就对指针搞的焦头烂额,今天,发现参数传递的时候,&符号也莫名其妙,搜了一篇好文,转载下来. 一. 函数参数传递机制的基本理论 函数参数传递 ...

随机推荐

  1. 记录--有关CSS盒模型之内边距、边框、外边距的十九问题

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇文章主要探讨盒模型,以及内边距.边框.外边距的面试题与思考,也希望您能把您的思考和遇到的问题以评论的方式补充下,后期,我将会补充到文章 ...

  2. .Net MinimalApis响应返回值

    前言 文本主要讲 MinimalApis 中的使用自定义IResultModel和系统自带IResult做响应返回值. MinimalApis支持以下类型的返回值: string - 这包括 Task ...

  3. [SQL]SQL注入与SQL执行过程(基于JDBC)

    [版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17955065 出自[进步*于辰的博客] 参考笔记一,P ...

  4. python opencv DNN 人脸检测

    import cv2 modelFile = "res10_300x300_ssd_iter_140000_fp16.caffemodel" configFile = " ...

  5. Ant Design Vue Tree 选中子节点同时半选中父级节点

    需要实现的效果: 1.子菜单如果不是全部选中,一级菜单半选. 2.子菜单全选,一级菜单选中. 3.一级菜单选择,二级菜单全选. 4.没有二级菜单,则只控制一级菜单. 主要用到的属性是checked和h ...

  6. 【已解决】aconda3 创建和切换jupyter Kernel(安装好了tensorflow在jupyter中无法使用)

    如下图:在这里更换python环境内核(如果你把tensorflow安装在了一个新建的虚拟环境) 1. 创建新的环境(或者是直接激活进入已经安装了tensorflow的环境) conda create ...

  7. PyCharm专业版延长使用时间【极简】

    关注公众号[靠谱杨阅读人生]回复[py]获取破解包! 准备好最新版本的PyCharm(去官网下载页面上的第一个就可以,我使用的版本如下图所示) 打开软件选择试用,进去之后可以新建一个项目然后把这个压缩 ...

  8. 本周四晚19:00知识赋能第七期第3课丨OpenHarmony WiFi扫描仪实现

    8月25日19:00~20:00,第七期知识赋能第三节直播就要开始啦!如果你是缺乏实战经验的学生,如果你是初出茅庐的职场新人,如果你是想参与开源的贡献者,那么本期的直播课将不容错过!通过本期直播,开发 ...

  9. 深入理解 C++ 语法:从基础知识到高级应用

    C++ 语法 让我们将以下代码分解以更好地理解它: 示例 #include <iostream> using namespace std; int main() { cout <&l ...

  10. Kubernetes(K8S)命令指南

    本文提供了一份全面的Kubernetes(K8S)命令指南,旨在帮助用户掌握和运用K8S的各种命令. 关注[TechLeadCloud],分享互联网架构.云服务技术的全维度知识.作者拥有10+年互联网 ...