假设我有一个 Clojure 树,定义如下
(def eval-logic
'(:OR
(:METHOD "methodName1" ["a1" "a2" "a3"])
(:METHOD "methodName2" ["b1" "b2" "b3"])
:AND
(:METHOD "methodName3" [])
(:METHOD "methodName4" ["d1"])
))
即树代表一个布尔表达式,其中像:OR 和:AND 这样的节点代表布尔运算符,而树的叶子是方法调用。树不会被评估,只会被遍历以生成在运行时执行实际评估的代码。我应该如何遍历树、访问不同类型的节点、询问节点的父亲、孩子、兄弟姐妹等?是否有任何指针或库可供研究?
树不能嵌套太深,所以尾递归不是问题。随意提出一些可能更适合遍历的其他数据结构。
我对深度优先遍历特别感兴趣,因为这是代码必须生成的顺序,以确保在使用函数之前定义函数。此外,树是给定的并且不会改变,所以我对添加或删除孩子等事情不感兴趣