我在编写树搜索和替换算法时遇到问题。输入树包含任意嵌套的数据项——例如,tree = (1 (2 3 (4 (5)) 6)),其中 1 是根,并且向下的每一级都嵌入在括号中。所以 1 在第 1 级;2、3、4、6 位于第 2 层(低于 1),5 位于第 3 层(低于 4)。整个树的结构使得任何列表的汽车始终是一个数据项,其后可以是其他数据项或子树。问题是在树中找到与输入项匹配的数据项(在我的特定情况下为#'equal),并用给定的新子树替换现有的旧项——例如,(交换子树旧项树...)。因此,树会随着每次替换而增长。但是,搜索必须在树中自上而下进行,仅交换找到的第一个此类旧项目,然后退出。
一些观察?:1)对于二叉树,搜索顺序(自上而下的访问)通常称为级别顺序,其他可能的搜索顺序是前序、中序和后序,但我的树不一定是二进制的。2)像广度优先搜索算法这样的东西可能会起作用,但是节点是通过树遍历选择的,而不是生成的。3) 标准的“替代”功能仅适用于序列,不适用于树。4)“subst”函数适用于树,但似乎以深度优先的方式遍历替换所有匹配项,并且没有 :count 关键字(如“substitute”)在第一次替换后停止。
任何帮助编码甚至构建一个好的方法都将不胜感激。(也很好奇为什么 common-lisp 没有更多的列表和向量的“树”函数。)