大二叉树遍历某一个节点下的所有子孙节点?

一个大的二叉树,树层级是不确定,现在要实现这么几个需求:
1.记录层级关系。比如:给你一个节点id:9,需要查询出这个节点下的儿子或者孙子,或者....或者所有子孙节点
2.还要一下查询统计需求

对于需求1,我这边是讲节点id存储到redis里面,结构是zset, key是节点id,score是层级关系,如果是儿子节点,score就是-1,孙子就是-2,以此内推。。层级无限,有可能很多层。越往后的score越小。

但是这样存储有一个问题,就是查询统计需求就不太好弄了,比如,我需要查询出某个节点下的所有当天新增的节点。这类需求,目前我想到的就是从redis拿到当前节点下的所有子孙节点id,然后通过id去数据库里面通过in过滤出当天的新增节点,这样有一个问题,就是如果子孙节点太多,in查询效率非常低,服务会挂。

不知道大家谁有没有好一点的方案?目前在研究Neo4j,这个图形数据库,不知道能不能实现这样的需求?有大神使用过吗?

阅读 3.2k
2 个回答

你的需求看不出要用redis的理由,可以简单的使用关系型数据库实现树形层级关系,使用某个字段保存父子路径关系。比如 root 1 , 有两个节点 , 1-2-,1-3-; 2,3又有儿子节点 1-2-4-,1-3-5-,那么统计只要简单的like 就可以方便的拿到本节点的所有子孙节点,比如查询 path like '1-%',即为拿到id=1的所有子孙节点,path like '1-2-%'即为拿到id=2的所有子孙节点。

你存储二叉树的这个方法没什么问题。你说从redis拿到了所有的子孙节点的id,然后去数据库用in过滤当天的新增节点。是这样吗? select * from tab where id in (ids) and date =sysdate; 那么就是如果子孙节点很多,这个ids就会非常大。我不知道你是不是想这个样。但是你现在存在redis的id和score都可以做关系型数据库的索引(id相当于主键,distinct(score)最大是2),所以没必要存在非得用redis。再针对业务中经常出现的查询条件做一下hash,比如这个日期就可以。如果每天新增的数据量很多的话甚至可以做一下分表。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题