论坛首页 Java企业应用论坛

java树形结构 算法

浏览 31495 次
精华帖 (2) :: 良好帖 (8) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2010-03-01  
zhanglun1225 写道
andsofish 写道
还有一个问题:你的id是自增长编号么?
如何保证,between lft 和 rgt 不会包含兄弟的子节点啊?

          1
      /    \
     2      3
    / \    /
   4   5  6 
  /
7

2节点的lft和rgt分别是?


这个id是数据库的主键,不一定是自动增长的,根据自己选择的数据库类型来定,只要唯一就可以了。
“如何保证,between lft 和 rgt 不会包含兄弟的子节点啊?”这个问题,查询的sql语句我已经给出来了,你可以测试一下。

            1 A 14
        /        \
    2  B 9      10 C 13
    /    \       \ 
  3 D 6  7 E 8    11 F 12 
  /
4 G 5

其中A、B、C等字母代表节点,而数字分别代表lft和rgt,比如A的lft=1,rgt=14


谢谢,我基本看懂了

新的问题

            1 A 14
        /        \
    2  B 9      10 C 13
    /    \       \ 
  3 D 6  7 E 8    11 F 12 
  /
4 G 5

我要为G增加一个兄弟,按照增加算法,增加后为
            1 A 16
        /        \
    2  B 11      12 C 15
    /    \       \ 
  3 D 8  9 E 10    13 F 14 
  /    \
6 G 7 4 X 5 

遍历路径似乎不太对了吧。 
也许还是我对LFT何RGT的由来有点疑问导致的,到底这两个值是如何计算出来的?
是通过前序遍历算法得来的么?
0 请登录后投票
   发表时间:2010-03-01   最后修改:2010-03-01
新的问题

            1 A 14
        /        \
    2  B 9      10 C 13
    /    \       \ 
  3 D 6  7 E 8    11 F 12 
  /
4 G 5

我要删除B,按照增加算法,删除后为
            1 A 12
        /        \
              8 C 11
    /    \       \ 
  1 D 4  5 E 6    9 F 10 
  /
2 G 3 

不知是否可以删除树枝?
从sql查询来看,还是满足条件的,但是二叉树被破坏了。
0 请登录后投票
   发表时间:2010-03-01  
left / right 如何维护?
0 请登录后投票
   发表时间:2010-03-02  
            1 A 14
        /        \
    2  B 9      10 C 13
    /    \       \ 
  3 D 6  7 E 8    11 F 12 
  /
4 G 5

这样的树形结构是怎么生成的?
以你的算法生成树应该是
           1 A 6
        /        \
    4 B 4     2 C 3
才对   
0 请登录后投票
   发表时间:2010-03-02  
andsofish 写道
zhanglun1225 写道
andsofish 写道
还有一个问题:你的id是自增长编号么?
如何保证,between lft 和 rgt 不会包含兄弟的子节点啊?

          1
      /    \
     2      3
    / \    /
   4   5  6 
  /
7

2节点的lft和rgt分别是?


这个id是数据库的主键,不一定是自动增长的,根据自己选择的数据库类型来定,只要唯一就可以了。
“如何保证,between lft 和 rgt 不会包含兄弟的子节点啊?”这个问题,查询的sql语句我已经给出来了,你可以测试一下。

            1 A 14
        /        \
    2  B 9      10 C 13
    /    \       \ 
  3 D 6  7 E 8    11 F 12 
  /
4 G 5

其中A、B、C等字母代表节点,而数字分别代表lft和rgt,比如A的lft=1,rgt=14


谢谢,我基本看懂了

新的问题

            1 A 14
        /        \
    2  B 9      10 C 13
    /    \       \ 
  3 D 6  7 E 8    11 F 12 
  /
4 G 5

我要为G增加一个兄弟,按照增加算法,增加后为
            1 A 16
        /        \
    2  B 11      12 C 15
    /    \       \ 
  3 D 8  9 E 10    13 F 14 
  /    \
6 G 7 4 X 5 

遍历路径似乎不太对了吧。 
也许还是我对LFT何RGT的由来有点疑问导致的,到底这两个值是如何计算出来的?
是通过前序遍历算法得来的么?


这个遍历路径是不准确了。不过,这个算法是在新闻发布栏目树里面用到的,只是方便N层栏目的查询,而得到的数据,我们可以根据别的字段来进行排序,达到想要的结果。如果再去考虑遍历的路径,个人觉得有点多余了。
不过您提到的问题,值得思考。谢谢
0 请登录后投票
   发表时间:2010-03-02  
andsofish 写道
新的问题

            1 A 14
        /        \
    2  B 9      10 C 13
    /    \       \ 
  3 D 6  7 E 8    11 F 12 
  /
4 G 5

我要删除B,按照增加算法,删除后为
            1 A 12
        /        \
              8 C 11
    /    \       \ 
  1 D 4  5 E 6    9 F 10 
  /
2 G 3 

不知是否可以删除树枝?
从sql查询来看,还是满足条件的,但是二叉树被破坏了。



这个不是纯粹的算法,只是为了方便我们项目的一个工具,在项目中栏目树不能删除树枝,所以暂时未加考虑。。呵呵。不好意思。
不过您提出的问题,值得思考。。
0 请登录后投票
   发表时间:2010-03-03  
受用了..
0 请登录后投票
   发表时间:2010-03-03  
加一个字段orders ,平级排序,记录上级ID,记录子级所有ID, 一条SQL搞定。不用规递
0 请登录后投票
   发表时间:2010-03-18   最后修改:2010-03-18
我的算法是用节点深度加parentID解决
01
  0101
      010101
  0102
02
  0201
      020101
中等数据规模,100级以下

 
0 请登录后投票
   发表时间:2010-06-08  
我要是想显示树形列表 sql 又该如何书写 ?


如:
根目录
  目录1
  目录2
    目录2.1
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics