正因为不想用递归,才想和大家讨论这个问题,如果有了结果,也算是一大贡献。:) 可惜惟有楼上这么不厌其烦的参与,谢谢了! 我想到一个办法,可以增加一个字段index,专门用来保存各个节点前序遍历的序号,当插入一个节点时,先找到插入的位置,插入后,后面的结点index加1。这样,只要用SELECT * FROM t ORDERBY index ASC 和可能得到前序遍历了。 插入语句大概可以写成 UPDATE t SET index=index+1 WHERE index>f //f为插入位置序号 INSERT INTO t(index) VALUES(f+1); //插入节点 不过这样得频繁修改数据库,不知道这样是否得不偿失?
如果一定要任意层的话,只能用int作为节点标志,+parent属性了。
但这样生成树的速度会很慢(只能用递归)
可惜惟有楼上这么不厌其烦的参与,谢谢了!
我想到一个办法,可以增加一个字段index,专门用来保存各个节点前序遍历的序号,当插入一个节点时,先找到插入的位置,插入后,后面的结点index加1。这样,只要用SELECT * FROM t ORDERBY index ASC 和可能得到前序遍历了。
插入语句大概可以写成
UPDATE t SET index=index+1 WHERE index>f //f为插入位置序号
INSERT INTO t(index) VALUES(f+1); //插入节点
不过这样得频繁修改数据库,不知道这样是否得不偿失?
例如:1 -> 0001
1-1 -> 00010001
1-2 -> 00010002
500-20-30 -> 050000200030因为字段比较长,不要定义成数字类型。
比如:下一个兄弟序号增加1的问题。例如:序号取长度2,有一个第二层节点序号为05-12,那么它的下一个兄弟节点为05-13,但是它怎么知道它的前一个兄弟序号为12?一种方法:在它们的父亲中存储孩子中的最大序号,如存储12,那么再增加一个孩子节点的时候序号就为13,同时把13存储下来。这样就需要再增加一个字段max_id来存储孩子中的最大序号,但如果删除了孩子,就会出现max_id为99,但实际只存储了少于99个孩子,如何处理才能真正存储99个孩子?