原理讲解

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

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. 使用JMeter从JSON响应的URL参数中提取特定值

    在使用Apache JMeter进行API测试时,我们经常需要从JSON格式的响应中提取特定字段的值.这可以通过使用JMeter内置的JSON提取器和正则表达式提取器来完成.以下是一个具体的例子,展示 ...

  2. .Net MinimalApis响应返回值

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

  3. hdfs开启回收站(废纸篓)

    1.背景 我们知道,在mac系统上删除文件,一般情况下是可以进入 废纸篓里的,如果此时我们误删除了,还可以从 废纸篓中恢复过来.那么在hdfs中是否存在类似mac上的废纸篓这个功能呢?答案是存在的. ...

  4. Lambda表达式编写递归函数

    class Program { //Fix求出的是函数f的不动点,它就是我们所需要的递归函数: static Func<T, TResult> Fix<T, TResult>( ...

  5. KingbaseES 物理备库影响主库的性能与垃圾回收

    前言 KingbaseES 物理备库有些配置可能影响到主库性能,或者反过来说主库某些配置也会影响到备库.终极原因还是heap tuple 和dead tuple放在一起导致的. 首先,原理上讲,物理备 ...

  6. PostgreSQL 函数稳定性在索引与全表访问下的性能差异

    一.构建测试数据 create or replace function test_volatile(id integer) returns bigint volatile language sql a ...

  7. virtualbox安装windows10出现OOBE,卡在OOBE。

    参照 https://zhuanlan.zhihu.com/p/419237209 https://www.0z.gs/win/781.html 文档 https://learn.microsoft. ...

  8. STM32中RFID模块(MFRC522)简单应用

    1. 前言 ​ 此篇只是对RFID模块的简单概述以及应用,没有原理,对提供的店家提供的代码,进行注释,以及简单使用流程 2. 函数 //功 能:寻卡 //参数说明: req_code[IN]:寻卡方式 ...

  9. 配置腾讯云轻量级linux服务器用到的资源和步骤

    pasv_address=82.157.112.34 #请修改为您的 Linux 云服务器公网 IPsftp://82.157.112.34:21 ①下载系统可视化https://cloud.tenc ...

  10. 解密数仓的SQL ON ANYWHERE技术

    本文分享自华为云社区<GaussDB DWS的SQL ON ANYWHERE技术解密>,作者:tooooooooooomy. 1. 前言 适用版本:[8.1.1(及以上)] 查询分析是大数 ...