博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多叉树实现类目体系
阅读量:5815 次
发布时间:2019-06-18

本文共 2155 字,大约阅读时间需要 7 分钟。

1. 引言

电商类的网站(比如:京东)为了便于用户浏览商品,建立了一套类目体系,对商品进行各种粗细粒度的划分。类似地,用户画像的标签体系也划分多层级的结构。在做标签洞察时,需要将这种带有层级的体系序列化json,提供给前端。但是,标签体系是存储在MySQL数据库中,为平铺化的表结构,如何将其表达为具有层次的数据结构呢?多叉树(Multiway Tree)正好能完美地诠释类目体系,比如,一篇论文的结构对应于一棵多叉树,如下图所示:

399159-20160830201403824-609755103.jpg

从上图可以看出,不同于二叉树,多叉树的非叶子节点的孩子节点数目可以为任意整数,而不仅局限于1或2。

2. 代码实现

数据库读取

用DBUtils封装从父节点得到所有子节点的方法:

public List
getChildren(String id) { ResultSetHandler
> h = new BeanListHandler<>(IDName.class); try { List
results = run.query("select ...", h, id); if (results.size() == 0) { results = run.query("select ...", h, id); } return results; } catch (SQLException e) { System.err.println("sql exception"); } return null;}

定义

多叉树的树节点定义如下:

public class TagTreeNode {  private String id;  private String name;  private List
children = new LinkedList<>(); public TagTreeNode(String id, String name) { this.id = id; this.name = name; } // gettter & setter}

idname为节点的属性值,children为子节点list。

构造

多叉树的构造大致分为两类:BFS与DFS。数据库读取拿到的是父节点所有的子节点,因此只能采取BFS来构造了。众所周知,BFS遍历时需要借助队列用以缓存以访问的节点,Java实现代码如下:

public class TagTree {  public TagTreeNode root; // root node  private Queue
queue = new LinkedList<>(); // create multiway tree public TagTree(TagUtil td, Connection conn, String id, String name, Level level) throws SQLException { init(td, conn, id, name); generate(td, conn); } // add children nodes private void addChildren(TagUtil td, Connection conn, TagTreeNode parent) { List
idnames = td.getChildren(conn, parent.getId()); if (idnames != null) { for (IDName idname : idnames) { TagTreeNode node = new TagTreeNode(idname.getId(), idname.getName()); queue.add(node); parent.getChildren().add(node); } } } public void init(TagUtil td, Connection conn, String id, String name) { root = new TagTreeNode(id, name); addChildren(td, conn, root); } public void generate(TagUtil td, Connection conn) { while (!queue.isEmpty()) { TagTreeNode node = queue.remove(); addChildren(td, conn, node); } }}

转载于:https://www.cnblogs.com/en-heng/p/5823469.html

你可能感兴趣的文章
java.lang.IllegalArgumentException: Called attach on a child which is not detached: ViewHolder
查看>>
Python全栈--6.1-match-search-findall-group(s)的区别以及计算器实例
查看>>
对于约数个数上界的估计
查看>>
div没有设置高度时背景颜色不显示(浮动)
查看>>
@Resource与@Autowired注解的区别
查看>>
版本控制之一:SVN服务器搭建与安装(转)
查看>>
href 和src 的区别
查看>>
测试工程师能力胜任模型
查看>>
Network - 对比net-tools与iproute2
查看>>
Spring cloud consul 相关前提知识
查看>>
ASP.NET4.5Web API及非同步程序开发系列(3)
查看>>
Ruby学习计划-(1)搭建开发环境
查看>>
SilverLight中的一些常用控件
查看>>
修复火狐主页被篡改成hao123的办法
查看>>
C# 类型转换 Dictionary转Model类
查看>>
极限问题
查看>>
最大子序列和最大子矩阵
查看>>
网络基础知识
查看>>
Jaxb annotation初步使用
查看>>
[Shoi2011]双倍回文
查看>>