树结构的数据在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树来形象表示。在程序中应用比较多的 如:权限设计、功能菜单、系统菜单 很多地方都要用到这种树形结构的数据库设计,所以在此研究一下,希望和所有关注的朋友一起来研究!
名词解释:
二叉树
树是一种重要的非线性数据结构,直观地看,它是数据元素(在树中称为结点)按分支关系组织起来的结构,
很象自然界中的树那样。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构都可用树形象表示。
例如:一个公司网站的结构(当然可以更复杂)
1首页(1,28) 父节点范围:(x,y) x=初始值(1) y=2*节点个数
2公司简介(2,11) 子节点范围:(x,y) x=上级节点包含的子项最后一个数+2 y=级数*子项个数+x+1
3集团简介(3,4)
4品牌建设(5,6)
5组织结构(7,8)
6成员公司(9,10)
7新闻动态(12,19)
8地产新闻(13,14)
9法律法规(15,16)
10行业动态(17,18)
11工程在线(20,25)
12市广电中心(21,22)
13中山花园项目(23,24)
14客户服务 (26,27)
建立测试数据表:
Code
--建立以上结构的表
CREATE TABLE TestTree
(
id INT IDENTITY PRIMARY KEY,
node_min INT, --节点最小范围
node_max INT, --节点最大范围
node_lvl INT, --所属级数
nodename VARCHAR(50), --节点名称
nodeurl NVARCHAR(150) -- 节点路径
)
--建立测试数据
INSERT INTO TestTree VALUES (1,28,1,0,1,'首页','http://www.msdn.com')
INSERT INTO TestTree VALUES (2,11,2,1,2,'公司简介','http://www.msdn.com')
INSERT INTO TestTree VALUES (3,4,3,2,3, '集团简介','http://www.msdn.com')
INSERT INTO TestTree VALUES (5,6,3,2,4, '品牌建设','http://www.msdn.com')
INSERT INTO TestTree VALUES (7,8,3,2,5, '组织结构','http://www.msdn.com')
INSERT INTO TestTree VALUES (9,10,3,2,6,'成员公司','http://www.msdn.com')
INSERT INTO TestTree VALUES (3,12,2,1,7,'最新公告','http://www.msdn.com')
INSERT INTO TestTree VALUES (12,19,2,1,7,'新闻动态','http://www.msdn.com')
INSERT INTO TestTree VALUES (13,14,3,7,8, '地产新闻','http://www.msdn.com')
INSERT INTO TestTree VALUES (15,16,3,7,9, '法律法规','http://www.msdn.com')
INSERT INTO TestTree VALUES (17,18,3,7,10,'行业动态','http://www.msdn.com')
INSERT INTO TestTree VALUES (20,25,2,1,11,'工程在线','http://www.msdn.com')
INSERT INTO TestTree VALUES (21,22,3,12,12,'市广电中心','http://www.msdn.com')
INSERT INTO TestTree VALUES (23,24,3,12,13,'中山花园项目','http://www.msdn.com')
INSERT INTO TestTree VALUES (26,27,2,1,14,'客户服务','http://www.msdn.com')
查询结果:
遍历树:
Code
--查询树包含多少个节点
SELECT (node_max-node_min+1)/2 FROM TestTree WHERE id=1
--从首页节点(1,28)到成员公司节点(9,10)的路径 如:首页->公司简介->成员公司
SELECT * FROM TestTree WHERE node_min between 1 and 9 and node_max between 10 and 28 order by node_min
--反向 成员公司->公司简介->首页
SELECT * FROM TestTree WHERE node_min between 1 and 9 and node_max between 10 and 28 order by node_max
-- 得到某个节点下面的所有节点,且按照树状结构返回
--拿工程在线节点(20,25)为例
SELECT * FROM TestTree WHERE node_min>20 AND node_max<25 ORDER BY node_min
--得到首页下的第2级节点 显示为:公司简介,新闻动态,工程在线,客户服务
SELECT * FROM TestTree WHERE node_min>1 AND node_max<34 AND node_lvl=2 ORDER BY node_min
请继续看下篇.....