预排序遍历树算法(modified preorder tree traversal algorithm)
这个算法有如下几个数据结构:
1、lft 代表左 left
2、rgt 代表右 right
3、lvl 代表所在的层次 level
下面这个图是一个典型的结构:
我们先看一些使用方法
1、查看整个树(A)有多少节点(包含自己),直接看根节点就行了 (right-left+1)/2 = (20-1+1)/2 = 10
这个数有10个节点
2、查看从节点A到E的路径
1 select * from tree where lft between 1 and 6 and rgt between 7 and 20 order by lft
得到的结果是A,B,D,E 这4个节点的数据,且按照访问路径的顺序
如果2个节点之间不是上下级的关系,则查询没有结果
反向也是一样的,可以拿到底部一个节点,到上级节点的路径
1 select * from tree where lft between 1 and 6 and rgt between 7 and 20 order by lft desc
唯一的区别就是排序是反向的就行了。
3、得到某个节点下面的所有节点,且按照树状结构返回我们用B做例子
1 select * from tree where lft>2 and right<11 order by lft
拿到的结果是 C,D,E,F,而且顺序也是正确的。
4、拿到所有下2级的子节点我们A做例子,这次加上了lvl的参数,因为A的level是1,所以我们查询level不大于3的。
1 select * from tree where lft>2 and right<11 and lvl<=3 order by lft
下面看我们新增加一个节点的方法。我们在根节点的下面,G节点的右侧增加一个X节点
我们要做的工作就是
1、G节点的右参数为13
2、变更所有的受影响的节点,给新节点腾出空位子,所有左节点比G节点大的,都增加2
1 update tree set lft=lft+2 where lft>12
所有右节点比G节点大的,都增加2
1 update tree set rgt=rgt+2 where rgt>13
3、新节点放在空位子上,lft=14,rgt=15,这样就完成了一个新节点的增加操作。
算法说明:
1.所有分类 左边和右边的值 > 插入节点的左边节点记录的右值 的全部 + 2
2.插入节点 左值 = 插入位置左边节点记录的右值 + 1, 右值 = 插入位置左边节点记录的右值 + 2
本文来自http://www.cnblogs.com/woodcutter/archive/2010/04/21/1716923.html,在此感谢!
其它相关说明请参考:
http://be-evil.org/tb.php?sc=67fcc&id=168
http://blog.csdn.net/wisewillpower/archive/2008/04/19/2306461.aspx
- 大小: 47.5 KB
- 大小: 44.8 KB
分享到:
相关推荐
预排序遍历树算法 (modified preorder tree traversal algorithm) 的 Laravel / lumen 实现。 假定使用的模型名为 Tree ,对应表应至少包含下列字段,字段类型建议为无符号整数。 id 为主键 pid 为父级的 id ,此项在...
本文主要介绍了组织机构数据库设计中的一种高效算法--预排序遍历树算法(Modified Preorder Tree Traversal Algorithm)。该算法适用于组织机构的数据库设计,能够高效地存储和查询组织机构的树形结构数据。 在组织...
预排序遍历树算法(modified preorder tree traversal algorithm)是另一种用于实现无限分类的方法,它通过在节点数据中增加两个字段:lft(left)和rgt(right),这两个字段的值表示该节点在遍历树的过程中,左值...
在`BinaryTree_PreOrder.java`中,应该能找到前序遍历的代码实现,其递归版本会首先访问根节点,然后遍历左子树,最后遍历右子树。 5. **遍历算法的非递归实现** 虽然递归是最直观的方法,但非递归实现(如使用栈...
其他常见的遍历方式还包括前序遍历(Preorder Traversal,DLR)和后序遍历(Postorder Traversal,LRD)。 除了二叉查找树,还有其他高级数据结构,如堆(Heap)、并查集(Disjoint Set)、Trie树、AVL树和红黑树。...
- 前序遍历(Preorder Traversal) - 中序遍历(Inorder Traversal) - 后序遍历(Postorder Traversal) #### Huffman压缩(Huffman Compression) - **定义**: 一种用于无损数据压缩的方法。 - **原理**: 使用变长编码...
DFS有两种主要变体:前序遍历(Preorder Traversal)、后序遍历(Postorder Traversal)。在树中,前序遍历的顺序为根-左-右,后序遍历的顺序为左-右-根。在图中,由于边的无序性,这些概念可能不太适用,但基本的...
例如,Binary Tree Preorder Traversal(二叉树前序遍历)和Shortest Path in Binary Matrix(二进制矩阵中最短路径)等。 二、算法策略 1. 搜索:深度优先搜索(DFS)和广度优先搜索(BFS)是解决许多问题的有效...