好的概述
一般来说,您要在快速读取时间(例如,嵌套集)或快速写入时间(邻接列表)之间做出决定.通常,您最终会得到最适合您需求的以下选项组合.以下提供了一些深入阅读:
选项
我知道和一般的功能:
O(n/2)移动,插入,由于易失性编码而删除O(log n)插入,更新,删除的成本(子树的大小)LEFT(lineage, #) = '/enumerated/path')O(log n)插入,更新,删除的成本(子树的大小)假设您有一个存储有序树层次结构的平面表:
Id Name ParentId Order
1 'Node 1' 0 10
2 'Node 1.1' 1 10
3 'Node 2' 0 20
4 'Node 1.1.1' 2 10
5 'Node 2.1' 3 10
6 'Node 1.2' 1 20
Run Code Online (Sandbox Code Playgroud)
这是我们所拥有的图表[id] Name.根节点0是虚构的.
[0] ROOT
/ \
[1] Node 1 [3] Node 2
/ \ \
[2] Node 1.1 [6] Node 1.2 [5] Node 2.1
/
[4] Node 1.1.1
您将使用什么简约方法将其输出为HTML(或文本,就此而言)作为正确排序,正确缩进的树?
进一步假设你只有基本的数据结构(数组和散列图),没有带有父/子引用的花哨对象,没有ORM,没有框架,只有你的双手.该表表示为结果集,可以随机访问.
伪代码或普通英语是可以的,这纯粹是一个概念性的问题.
额外问题:在RDBMS中存储这样的树结构是否有根本更好的方法?
编辑和补充
回答一个评论者(Mark Bessey的)问题:根节点不是必需的,因为它永远不会被显示.ParentId = 0是表示"这些是顶级"的惯例.Order列定义了如何对具有相同父节点的节点进行排序.
我所谈到的"结果集"可以被描绘成一组哈希图(保留在该术语中).因为我的例子意味着已经存在.有些答案会加倍努力并首先构建它,但那没关系.
树可以任意深.每个节点可以有N个子节点.不过,我并没有考虑到"数百万条目".
不要将我选择的节点命名('Node 1.1.1')误认为是依赖的东西.节点同样可以称为"Frank"或"Bob",不暗示命名结构,这只是为了使其可读. …
是否有一个良好的可用(标准Java)数据结构来表示Java中的树?
具体来说,我需要代表以下内容:
是否有可用的结构或我是否需要创建自己的结构(如果是这样的实现建议会很好).
Killswitchcollective.com的旧文章,2009年6月30日,有以下输入和输出
git co master
git merge [your_branch]
git push
upstream A-B-C-D-E A-B-C-D-E-F-G
\ ----> \
your branch C-D-E G
Run Code Online (Sandbox Code Playgroud)
我感兴趣的是如何在终端中获得提交树的视图,而不使用OS/X中的Gitk或Gitx.
你怎么能在终端获得树状的提交视图?
为什么C++ STL不提供任何"树"容器,而最好使用什么?
我想将对象的层次结构存储为树,而不是使用树作为性能增强...
任何人都可以用一个例子解释二叉树和二叉搜索树 之间的区别吗?
这是算法理论中的一个简单问题.
它们之间的区别在于,在一种情况下,您可以计算根节点和具体节点之间最短路径上的节点数和其他边数.
哪个是哪个?
我找不到这个答案:
我的AJAX调用返回JSON数据.在Google Chrome开发者工具>资源> XHR中,当我单击左侧的资源,然后单击"内容"选项卡上时,我将JSON字符串视为字符串,而不是Firebug和Firebug Lite所做的树.
如何强制Chrome将其作为树显示.是否有我的PHP文件必须具有的Content-type?
我很乐意知道答案!
谢谢Stefanos
在以下方面,段树,间隔树,二进制索引树和范围树之间有什么区别:
请不要只给出定义.
我正在尝试构建一个通用树.Python中是否有内置的数据结构来实现树?
tree ×10
algorithm ×3
sql ×2
ajax ×1
binary-tree ×1
c++ ×1
console ×1
database ×1
git ×1
java ×1
json ×1
nodes ×1
python ×1
python-3.x ×1
recursion ×1
segment-tree ×1
stl ×1
terminal ×1
terminology ×1
view ×1