树操作

转载 2004年09月07日 09:02:00
在开发数据库应用程序中,我们经常需要表示多层次关系的数据,譬如:MRP中的BOM,多级别的组织结构,多级的角色关系…… 在数据库中描述这种关系时,我们通常使用父节点指向的方式来设计表结构,譬如对部门的表结构定义如下:

  CREATE TABLE TDepartment
  (
    ParentNo varchar(25),    /* 上级部门编号,如果为NULL则表示当前记录为顶级部门。 */
    DepartmentNo varchar(25) PRIMARY KEY CLUSTERED/* 当前部门编号,主关键字段。 */
    Name  nvarchar(100) NOT NULL,   /* 部门名称。 */
    NameEx  nvarchar(100),    /* 扩展名称。 */
    Remark  nvarchar(500)    /* 备  注。 */
  )

  功能需求:获取指定部门编号及其所属的所有或指定层次的下级部门的记录集。

  在以往的开发中,我们通常是在客户端或者中间层来处理以上需求的,一般是通过编程语言(VB、Delphi、Java/.NET)来处理从数据库返回的记录集,这种方式通常需要从数据库获得整个表的记录,因为我们不能确定给定主键所具有的哪些下级记录,然后再在编程代码中使用递归的方式来获取相关的下级记录。这种使用递归的方式,通常难以避免数据中非法记录所引起的死循环问题(当然,你也可以处理这种问题,只是有些麻烦,而且通常也不够优美)。那么,能不能在数据库中就处理好这个问题呢,这样既能减少不必要的数据传输,又能避免使用递归所带来的负面影响,最好还能自动屏蔽掉非法数据指向的问题(当前记录的父指针字段指向其某个下级记录)。
  呵呵,卖弄完毕,亮出匕首(代码,Transact-SQL/MS-SQLServer 2000):

/* Copyright all(c) 2004 ZhongFeng, http://blog.csdn.net/SW515 */
CREATE PROCEDURE dbo.PSelectDepartmentHierarchy
  @DepartmentNo    varchar(25),
  @Depth           int  = -1
AS
  SET NOCOUNT ON

  DECLARE @TStack TABLE
  (
    Indicator varchar(50)
  )

  DECLARE @Index int
  SET @Index = 0

  INSERT INTO @TStack
    SELECT DepartmentNo
    FROM dbo.TDepartment
    WHERE DepartmentNo LIKE @DepartmentNo

  WHILE @@ROWCOUNT > 0 AND (@Index < @Depth OR @Depth < 0)
  BEGIN
    SET @Index = @Index + 1

    INSERT INTO @TStack
      SELECT DepartmentNo
      FROM dbo.TDepartment
      WHERE
        ParentNo IN (SELECT Indicator FROM @TStack) AND
        
DepartmentNo NOT IN (SELECT Indicator FROM @TStack)
  END

  SELECT dbo.TDepartment.*
  FROM @TStack AS t
    INNER JOIN dbo.TDepartment ON
      t.Indicator = dbo.TDepartment.DepartmentNo
GO

 

PS:

如果使用Oracle,则不必这么复杂。Oracle提供递归查询功能,如上面的需求,仅需要一句SQL语句即可轻松实现:

SELECT ParentNo, DepartmentNo, Name, NameEx, Remark
FROM TDepartment
START WITH DepartmentNo=指定的部门编号
CONNECT BY ParentNo = DepartmentNo;

数据结构实践——B-树的基本操作

本文是针对[数据结构基础系列(8):查找]的实践。【项目 - B-树的基本操作】 实现B-树的基本操作。基于序列{4, 9, 0, 1, 8, 6, 3, 5, 2, 7}完成测试。 (1)创建对...
  • sxhelijian
  • sxhelijian
  • 2015年11月29日 16:13
  • 2402

树的定义和基本操作

树(一般树) 定义和基本操作 树的术语 树的结构特点 树的基本操作 树的存储结构 树的遍历 定义和基本操作树是n(n>=0)个结点的有限集合.当n=0时,集合为空,称为空树.在任意一颗非空树中,有且仅...
  • forwardyzk
  • forwardyzk
  • 2016年12月29日 12:27
  • 550

树的基本操作

对于树来说我们基本的操作有统计它叶子的个数,还可以统计结点个数,以及每一层结点的个数: 首先,求叶子的个数,我们通过递归遍历的方法来实现: int getleaf(tree_node t) //...
  • fk5431
  • fk5431
  • 2015年05月08日 20:25
  • 1269

树的操作(C++)

结构体: 1、树的前序遍历(非递归) 树的前序遍历(递归方式) 2、树的中序遍历(非递归) 树的中序遍历(递归方式) 3、树的后续遍历(非递归) 树的后续遍历(递归方式) ...
  • zylmjy520
  • zylmjy520
  • 2016年06月17日 14:59
  • 302

数据结构:二叉搜索树(BST)的基本操作

学习过数据结构的童鞋都应该知道,对树的操作是一些最基本的技能(本文是对后面要写B树、B-树、B+树的一个前导学习,已经熟悉的朋友可以跳过了)。而在树结构中,二叉树又是最基础的。虽然这些知识是比较基础的...
  • u013761665
  • u013761665
  • 2015年12月21日 16:36
  • 1385

标题:伸展树的基本操作:

摘要: (1):基本思想:当访问到一个节点并进行操作后,它一定被移动到根处(通过类似于AVL树的一系列旋转的操作:展开)。 (2)伸展树的花费:它能够保证任意M次对树的基本操作只花费O(MlogN...
  • pp634077956
  • pp634077956
  • 2015年08月31日 16:47
  • 267

数据结构——树的简单操作集合

很多数据结构的书上讲解数据机构时都是采用伪代码实现,其实感觉蛮不直观的,所以对于所有的数据结构操作我都将其用C实现一遍。 树是学习二叉树的基础,也是后面理解B树,B+树的等树的基础,下面就给出树的几...
  • z702143700
  • z702143700
  • 2015年07月30日 10:05
  • 858

常见dom树操作

js操作dom节点 1.访问节点  document.getElementById(id); 返回对拥有指定id的第一个对象进行访问 document.getElementsByName(...
  • qq_36936155
  • qq_36936155
  • 2017年05月10日 19:58
  • 169

自学线段树的一些最最基本的操作

在最近两天的自学线段树当中,我领略了很多,接下来就讲一下我所领悟的东西。 首先,线段树的风格是比较重要的。每一个人写线段树都有很不一样的写法,我现在是看了老师教材里的写法写的,当然还有很多不一样的...
  • John_pascal
  • John_pascal
  • 2016年07月29日 14:14
  • 1203

红黑树插入删除操作

R-B Tree简介     R-B Tree,全称是Red-Black Tree,又称为“红黑树”,它一种特殊的二叉查找树。红黑树的每个节点上都有存储位表示节点的颜色,可以是红(Red)或黑(...
  • justdoithai
  • justdoithai
  • 2016年09月26日 15:42
  • 377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:树操作
举报原因:
原因补充:

(最多只允许输入30个字)