利用引用传递一次遍历构造菜单树(附java&go demo)
原理讲解
利用引用传递,当儿子的儿子变动的时候,自己的儿子的儿子也变动(取地址)
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)的更多相关文章
- [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 ...
- [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 ...
- 前序遍历构造已知二叉树(Java)
public BiNode createBiTree() { Scanner input = new Scanner(System.in); int k = input.nextInt(); if(k ...
- 关于java是值传递还是引用传递
一.概念 实际上对这两种传递方式,知乎上有个回答说得很好: 值传递和引用传递,属于函数调用时参数的求值策略(Evaluation Strategy),这是对调用函数时,求值和传值的方式的描述,而非传递 ...
- java只有值传递,不存在引用传递
今天,我在一本面试书上看到了关于java的一个参数传递的问题: 写道 java中对象作为参数传递给一个方法,到底是值传递,还是引用传递? 我毫无疑问的回答:“引用传递!”,并且还觉得自己对java的这 ...
- 解惑4:java是值传递还是引用传递
一.概述 曾经纠结了很久java的参数传递方式是什么样的,后面粗略的了解了一鳞半爪以后有了大概的印象:"传参数就是值传递,传对象就是引用传递",后面进一步查找了相关资料和文章以后, ...
- 面试官问:Go 中的参数传递是值传递还是引用传递?
一个程序中,变量分为变量名和变量内容,变量内容的存储一般会被分配到堆和栈上.而在 Go 语言中有两种传递变量的方式值传递和引用传递.其中值传递会直接将变量内容附在变量名上传递,而引用传递会将变量内容的 ...
- 通过有序线性结构构造AVL树
通过有序线性结构构造AVL树 本博客旨在结局利用有序数组和有序链表构造平衡二叉树(下文使用AVL树代指)问题. 直接通过旋转来构造AVL树似乎是一个不错的选择,但是稍加分析就会发现,这样平白无故做了许 ...
- Java基础_0310:引用传递
引用传递 引用传递是Java之中最让初学者费解的概念,而在实际的开发之中,引用传递又有着非常重要的作用: 引用传递的核心在于同一块堆内存空间被不同的栈内存所指向: 范例:第一道引用传递范例 class ...
- c/c++值传递和引用传递
今天看数据结构的时候,因为是c语言版的,刚开始学的时候就对指针搞的焦头烂额,今天,发现参数传递的时候,&符号也莫名其妙,搜了一篇好文,转载下来. 一. 函数参数传递机制的基本理论 函数参数传递 ...
随机推荐
- SpringBoot使用org.springframework.util监控java代码执行耗时时长
public class StopWatchTask { public static void main(String[] args){ //创建一个计时器 StopWatch stopWatch = ...
- KingbaseES 语句like前匹配如何使用索引
前言 有现场同事反馈 sql语句 like 使用后缀通配符 % 不走索引. 至于执行计划没走索引的原因与KingbaseES数据库中的排序规则相关. 测试 测试环境: KingbaseESV8R6C7 ...
- 命令行部署KingbaseES流复制
建立系统数据库安装用户组及用户,在所有的节点执行 root用户登陆服务器,创建用户组及用户并且设置密码 groupadd -g 2000 kingbase useradd -G kingbase -g ...
- Scala 不可变列表List
1 package chapter07 2 3 object Test04_List { 4 def main(args: Array[String]): Unit = { 5 // 1. 创建一个L ...
- #提交答案题#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 ...
- #最小生成树,Trie#CF888G Xor-MST
题目 给定 \(n\) 个结点的无向完全图.每个点有一个点权为 \(a_i\) . 连接 \(i\) 号结点和 \(j\) 号结点的边的边权为 \(a_i\oplus a_j\) . 求这个图的 MS ...
- DevEco Studio的这些预览能力你都知道吗?
在万物互联的今天,开发者在应用/服务开发过程中,需要考虑应用/服务在不同设备上的运行效果.为满足这一需求,DevEco Studio 作为 HarmonyOS 和 OpenAtom OpenHarmo ...
- Spring Boot 嵌入式服务器、Hibernate 关系和 Spring Data 全解析
嵌入式服务器 Spring Boot 的嵌入式服务器功能是一项方便而强大的功能,它允许你在应用程序中直接运行 Web 服务器,无需将其部署到单独的独立 Web 服务器中.这使得开发.测试和部署 Web ...
- elasticsearch映射创建查询 和Spring Data ElasticSearch入门
Elasticsearch核心概念 Elasticsearch是面向文档(document oriented)的,这意味着它可以存储整个对象或文档(document).然而它不仅 仅是存储,还会索引( ...
- 基于pdfbox实现的pdf添加文字水印工具
简述 最近有个需求需要给pdf加文字水印,于是开始搜索大法,但是发现网络上的代码基本都是将字体文件直接放在jar包里面.个人强迫症发作(手动狗头),想要像poi一样直接加载系统字体,于是研究了一下午p ...