为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕盖茨4494581 2019-05-13 09:33:12
一个大的二叉树,树层级是不确定,现在要实现这么几个需求:1.记录层级关系。比如:给你一个节点id:9,需要查询出这个节点下的儿子或者孙子,或者....或者所有子孙节点2.还要一下查询统计需求对于需求1,我这边是讲节点id存储到redis里面,结构是zset,key是节点id,score是层级关系,如果是儿子节点,score就是-1,孙子就是-2,以此内推。。层级无限,有可能很多层。越往后的score越小。但是这样存储有一个问题,就是查询统计需求就不太好弄了,比如,我需要查询出某个节点下的所有当天新增的节点。这类需求,目前我想到的就是从redis拿到当前节点下的所有子孙节点id,然后通过id去数据库里面通过in过滤出当天的新增节点,这样有一个问题,就是如果子孙节点太多,in查询效率非常低,服务会挂。不知道大家谁有没有好一点的方案?目前在研究Neo4j,这个图形数据库,不知道能不能实现这样的需求?有大神使用过吗?
查看完整描述

2 回答

?
森栏

TA贡献1810条经验 获得超5个赞

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

TA贡献2051条经验 获得超10个赞

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

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号