TreeScan
更多信息和选项
- 扫描一棵树也被称为树的遍历或树的搜索. 可以按多种不同的顺序访问子树,包括深度优先和广度优先遍历.
- 扫描树通常用于在子树上执行具有“副作用”的操作,例如进行赋值.
- TreeScan 允许将函数应用于 Tree 对象中任意层级范围上的子树的元素.
- TreeScan[f,tree] 丢弃对 tree 的数据应用 f 的结果. 与 TreeMap 不同,TreeScan 不会构建一个新树并返回.
- 可用 Throw 从 TreeScan 中退出.
- levelspecelem 的结构元素 elem 包括:
- 其他元素包括:
-
"OriginalChildren" 子树的原始孩子 "OriginalSubtree" 原始子树 "OriginalChildrenData" 孩子的原始数据 "Position" 子树的位置 "Index" 兄弟列表中子树的索引 "LevelPair" 子树的非负和负层级 "Level" 从根开始的子树非负层级 "NegativeLevel" 从叶子开始的子树负层级 - TreeScan 使用 TreeLevel 中的标准层级规范:
-
n 层 1 到 n Infinity 层 1 到 Infinity {n} 仅层 n {n1,n2} 层 n1 到 n2 All 层 0 到 Infinity "Leaves" 仅层 -1 "NonLeaves" 层 0 到 -2 - TreeScan 中 levelspec 的默认值为 {0,Infinity}.
- TreeScan 以从左到右、深度优先的顺序遍历子树,访问父母之前先访问孩子.
- TreeScan[…,TreeTraversalOrderorder] 允许以不同的顺序访问子树,如深度优先和广度优先的遍历.
- TreeScan[f][tree] 等价于 TreeScan[f,tree].
范例
打开所有单元 关闭所有单元基本范例 (5)
TreeScan[Print, [image]]TreeScan[Print, [image], {0, 1}]TreeScan[Print, [image], All -> "OriginalSubtree"]TreeMap[Echo, [image], All -> {"Data", "Position"}]使用 TreeScan 的算符形式:
TreeScan[Print][[image]]范围 (12)
层级指定 (5)
tree = [image];TreeScan[Print, tree, All]TreeScan[Print, tree, 2]TreeScan[Print, tree, {2}]TreeScan[Print, tree, {0, 2}]TreeScan[Print, [image], Infinity]TreeScan[Print, [image], {0, Infinity}]tree = [image];TreeScan[Print, tree, -1]TreeScan[Print, tree, -2]TreeScan[Print, tree, {-2}]TreeScan[Print, [image], {1, -1}]TreeScan[Echo, [image], "Leaves"]TreeScan[Echo, [image], "NonLeaves"]元素 (7)
TreeScan[Echo @* f, [image], All -> "Data"]TreeScan[Echo @* f, [image], All -> "Subtree"]TreeScan[Echo @* f, [image], All -> "OriginalSubtree"]TreeScan[Echo @* f, [image], All -> "Children"]TreeScan[Echo @* f, [image], All -> "OriginalChildren"]TreeScan[Echo @* f, [image], All -> "ChildrenData"]TreeScan[Echo @* f, [image], All -> "OriginalChildrenData"]TreeScan[Echo @* f, [image], All -> {"Data", "Position"}]TreeScan[Echo @* f, [image], All -> {"Data", "Index"}]TreeScan[Echo @* f, [image], All -> {"Data", "LevelPair"}]TreeScan[Echo @* f, [image], All -> {"Data", "Level"}]TreeScan[Echo @* f, [image], All -> {"Data", "NegativeLevel"}]TreeScan[Echo @* f, [image], All -> {"Data", "Position", "LevelPair"}]推广和延伸 (1)
选项 (3)
TreeTraversalOrder (3)
默认情况下,以深度优先的顺序访问子树,访问孩子后再访问父母:
Reap[TreeScan[Sow, [image], TreeTraversalOrder -> "DepthFirst"]][[2, 1]]Reap[TreeScan[Sow, [image], TreeTraversalOrder -> {"DepthFirst", "TopDown", "RightLeft"}]][[2, 1]]以广度优先的顺序访问子树,访问下一层上的节点之前先访问(距根节点)相同层级的节点:
Reap[TreeScan[Sow, [image], TreeTraversalOrder -> "BreadthFirst"]][[2, 1]]以叶优先的顺序访问子树,访问下一层上的节点之前先访问(距叶节点)相同层级的节点:
Reap[TreeScan[Sow, [image], TreeTraversalOrder -> "LeavesFirst"]][[2, 1]]属性和关系 (4)
TreeScan[Echo, [image]]TreeScan 执行与 TreeMap 一样的运算,但不返回结果:
TreeScan[Echo @* f, [image]]TreeMap[Echo @* f, [image]]ExpressionTree[1[2[3, 4], 5[6, 7]], "Heads"]TreeScan 扫描一棵树的子树的数据:
TreeScan[Echo, %, All]Scan 可以直接扫描标头和叶子:
mapAtData[f_][head_[args___]] := f[head][args]
mapAtData[f_][expr_] := f[expr]Scan[mapAtData[Echo], 1[2[3, 4], 5[6, 7]], All]Reap[TreeScan[If[# > 3, Sow[#]]&, [image]]][[2, 1]]可能存在的问题 (1)
TreeScan 默认从第 1 层开始,因此不会将函数应用于整棵树:
TreeScan[Echo, [image], -1]TreeScan[Echo, [image], {0, -1}]相关指南
-
▪
- 树中的计算
文本
Wolfram Research (2021),TreeScan,Wolfram 语言函数,https://reference.wolfram.com/language/ref/TreeScan.html (更新于 2022 年).
CMS
Wolfram 语言. 2021. "TreeScan." Wolfram 语言与系统参考资料中心. Wolfram Research. 最新版本 2022. https://reference.wolfram.com/language/ref/TreeScan.html.
APA
Wolfram 语言. (2021). TreeScan. Wolfram 语言与系统参考资料中心. 追溯自 https://reference.wolfram.com/language/ref/TreeScan.html 年
BibTeX
@misc{reference.wolfram_2026_treescan, author="Wolfram Research", title="{TreeScan}", year="2022", howpublished="\url{https://reference.wolfram.com/language/ref/TreeScan.html}", note=[Accessed: 14-November-2026]}
BibLaTeX
@online{reference.wolfram_2026_treescan, organization={Wolfram Research}, title={TreeScan}, year={2022}, url={https://reference.wolfram.com/language/ref/TreeScan.html}, note=[Accessed: 14-November-2026]}