原理讲解

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

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. SpringBoot使用org.springframework.util监控java代码执行耗时时长

    public class StopWatchTask { public static void main(String[] args){ //创建一个计时器 StopWatch stopWatch = ...

  2. KingbaseES 语句like前匹配如何使用索引

    前言 有现场同事反馈 sql语句 like 使用后缀通配符 % 不走索引. 至于执行计划没走索引的原因与KingbaseES数据库中的排序规则相关. 测试 测试环境: KingbaseESV8R6C7 ...

  3. 命令行部署KingbaseES流复制

    建立系统数据库安装用户组及用户,在所有的节点执行 root用户登陆服务器,创建用户组及用户并且设置密码 groupadd -g 2000 kingbase useradd -G kingbase -g ...

  4. Scala 不可变列表List

    1 package chapter07 2 3 object Test04_List { 4 def main(args: Array[String]): Unit = { 5 // 1. 创建一个L ...

  5. #提交答案题#LOJ 6467 'Zip' Quine

    题目 一种比较巧妙的方式 print 1 print 1 print 1 print 1 print 1 print 1 repeat 3 2 print 2 repeat 3 2 print 2 r ...

  6. #最小生成树,Trie#CF888G Xor-MST

    题目 给定 \(n\) 个结点的无向完全图.每个点有一个点权为 \(a_i\) . 连接 \(i\) 号结点和 \(j\) 号结点的边的边权为 \(a_i\oplus a_j\) . 求这个图的 MS ...

  7. DevEco Studio的这些预览能力你都知道吗?

    在万物互联的今天,开发者在应用/服务开发过程中,需要考虑应用/服务在不同设备上的运行效果.为满足这一需求,DevEco Studio 作为 HarmonyOS 和 OpenAtom OpenHarmo ...

  8. Spring Boot 嵌入式服务器、Hibernate 关系和 Spring Data 全解析

    嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能,它允许你在应用程序中直接运行 Web 服务器,无需将其部署到单独的独立 Web 服务器中.这使得开发.测试和部署 Web ...

  9. elasticsearch映射创建查询 和Spring Data ElasticSearch入门

    Elasticsearch核心概念 Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document).然而它不仅 仅是存储,还会索引( ...

  10. 基于pdfbox实现的pdf添加文字水印工具

    简述 最近有个需求需要给pdf加文字水印,于是开始搜索大法,但是发现网络上的代码基本都是将字体文件直接放在jar包里面.个人强迫症发作(手动狗头),想要像poi一样直接加载系统字体,于是研究了一下午p ...