首页 > 其他分享 >树形结构转列表的递归优化

树形结构转列表的递归优化

时间:2022-08-31 23:46:02浏览次数:100  
标签:code 递归 List 列表 树形 dict new Dict public

需求

之前做过堆栈,优化递归实现树形结构,最近遇到一个新的需求,将树形结构转化为列表,很多情况下都是使用递归来处理,因为该方式逻辑简单,其实一般情况下如果不牵扯单io操作,多层递归也不会有什么问题,想了一下这块也可以用堆栈做一个优化,闲来无事于是实现了一下。

代码实现

Dict类

static class Dict {
		public String code;
		public String name;
		public String parentCode;
		public List<Dict> children;
		public Dict(String code, String name, String parentCode) {
			this(code, name, parentCode, new ArrayList<>());
		}
		public Dict(String code, String name,String parentCode, List<Dict> children) {
			this.code = code;
			this.name = name;
			this.children = children;
			this.parentCode = parentCode;
		}
		
		public Dict(Dict dict) {
			this(dict.code, dict.name, dict.parentCode);
		}
		
	}

造数据方法

List<Dict> fakeDictData() {
		List<Dict> dict = new ArrayList<>();
		dict.add(new Dict("001", "编码-001", ""));
		dict.add(new Dict("002", "编码-002", "",Arrays.asList(new Dict("0021", "编码-0021", "002"),
				new Dict("0022", "编码-0022", "", Arrays.asList(new Dict("00221", "编码-00221", "0022"), new Dict("00222", "编码-00222", "0022"))))));
		System.out.println(JSON.toJSONString(dict));
		return dict;
	}

递归

/**
	 * 树形转列表-递归
	 */
	@Test
	public void testTree2ListRecuruly() {
		
		List<Dict> dict = fakeDictData();
		
		Stack<Dict> stack = new Stack<>();
		
		dict.forEach(d -> stack.push(d));
		
		List<Dict> newDict = new ArrayList<>();
		
		tree2ListRecuruly(dict, newDict);
		
		newDict.sort((d1,d2) -> d1.code.compareTo(d2.code));
		
		System.out.println(JSON.toJSONString(newDict));
		
	}
	
	
	public void tree2ListRecuruly(List<Dict> dictTree, List<Dict> dictList) {
		for(Dict d : dictTree) {
			dictList.add(new Dict(d));
			if(!d.children.isEmpty()) {
				tree2ListRecuruly(d.children, dictList);
			}
		}
	}

堆栈

/**
	 * 树形转列表-2
	 */
	@Test
	public void tree2List2() {
		List<Dict> dict = fakeDictData();
		
		Stack<List<Dict>> stack = new Stack<>();
		
		stack.push(dict);
		
		List<Dict> newDict = new ArrayList<>();
		while(!stack.isEmpty()) {
			List<Dict> pop = stack.pop();
			for(Dict d : pop) {
				newDict.add(new Dict(d));
				if(!d.children.isEmpty()) {
					stack.push(d.children);
				}
			}
		}
		
		newDict.sort((d1,d2) -> d1.code.compareTo(d2.code));
		
		System.out.println(JSON.toJSONString(newDict));
		
	}

比较了一下,输出结果和递归的保持一致,优化完成!

标签:code,递归,List,列表,树形,dict,new,Dict,public
From: https://www.cnblogs.com/bartggg/p/16644975.html

相关文章

  • 递归
    方法自己调用自己 递归实现数据区间的累加和publicclassTest{publicstaticvoidmain(String[]args){intn=sim(1,3);S......
  • 方法递归调用
    1.简单地说,递归就是方法自己调用自己,每次调用时传入不同的变量,递归有助于变成这解决复杂问题,同时可以让代码变得简洁。2.recursion 递归3.    4.factorial......
  • 合并k个有序列表-python
    主要思路:借鉴堆、队列特点,构建新的有序结果#mergetheksortedlist#mainidea:将每个list放入队列,初始一个小顶堆,size为list个数,value为队列的首个元素,交替寻找最......
  • HTML——列表标签
    ol:orderedlist有序列表标签:1.默认数字列表子标签:li标签属性字段:a:abcdA,大字母i:iiiiiiI:IIIIIIstart属性设置起始,<body><ol><li>......
  • python 修改列表元素
    修改列表的元素时,可以使用for循环结合range n=int(input())list_b=[[1,2,3],[4,5,6],[7,8,9]]foriinrange(len(list_b)):  foryinrange(len(l......
  • Java15-File类、递归
    Java15【File类、递归】主要内容File类递归Lambda优化第一章File类1.1概述java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找......
  • 递归详解
    递归详解在计算机科学领域,递归是用于处理一类具有相同子问题处理方式的问题;是数学归纳法,数学递推公式在计算机中的应用Thepowerofrecursionevidentlyliesin......
  • 构造函数初始化列表
    一.构造函数初始化列表的基本形式构造函数初始化列表以一个冒号开始,接着是以逗号分隔的数据成员列表,每个数据成员后面跟一个放在括号中的初始化式。第一种:......
  • vue+element 的使用问题记录-下拉列表绑定值为整数
     vue+element的使用问题记录 1、下拉列表绑定值为整数问题现象:下拉列表没有显示对应的文字,显示的是数字。  解决方法:对应的对象的类中的数据类型是Integer......
  • 标题和描述上带有文本覆盖的列列表
    标题和描述上带有文本覆盖的列列表标题和描述上带有文本覆盖的列列表您的项目的标题和描述片段上带有文本覆盖的列列表。此代码段是使用HTML、CSS等创建的。#javascrip......