为什么DOM树顺序是preorder
, depth-first traversal
?
与BFT等其他遍历相比,这种设计选择的优势是什么?
我只是在看DOM标准,发现前面和后面的定义:
如果对象A和B在同一棵树中,则对象A在对象B之前A按树的顺序排在B前面
如果对象A和B在同一棵树中,则对象A在对象B之后A按树的顺序排在B后面。
就像大多数编程范例一样,Web平台具有有限的分层树结构,简称树。树的顺序是预先排序,深度优先遍历。
深度优先遍历通常是最简单的遍历样式,因为您可以递归地或使用显式堆栈进行遍历;宽度优先需要一个队列,从某种意义上说,这是一个更复杂的数据结构。但我认为有一个比传统或简单更简单的答案:对(X)HTML树的深度搜索遍历导致按表示顺序遍历文本节点。
考虑这个相对简单的HTML子树。
或者,在HTML中:
<p>Consider this <em>relatively</em> simple <a href="http://en.wikipedia.org/wiki/HTML">HTML</a> subtree</p>
作为树(省略空格和属性):
<P>
|
+----------+-------+-----+------+
______|______ __|__ ___|__ _|_ ___|___
Consider this <EM> simple <A> subtree
| |
____|_____ __|__
relatively HTML
深度优先遍历:
<P>, Consider this, <EM>, relatively, simple, <A>, HTML, subtree
广度优先遍历:
<P>, Consider this, <EM>, simple, <A>, subtree, relatively, HTML
深度优先搜索需要按树的高度排序的内存,但宽度优先搜索需要按树的顶点基数排序的内存。换句话说,与深度优先的搜索相比,广度优先的搜索更占用内存。