I've just implemented an inorder traversal function for a vector-based tree.
The functions look like,
(defn- do-traversal [tree idx traversal]
(cond
(not (node-exists? tree idx)) traversal
(leaf? tree idx) (conj traversal (tree idx))
:else (apply conj
(do-traversal tree (left-child idx) traversal)
(tree idx)
(do-traversal tree (right-child idx) traversal))))
(inorder-traversal [tree]
(do-traversal tree root-idx []))
This works as expected but now I am looking to refactor the code some. I
wanted to see if I could do away passing an empty vector to the do-traversal
function. So I updated do-traversal to look like,
(defn- do-traversal [tree idx & tree-traversal]
(let [traversal (if tree-traversal tree-traversal [])]
(cond
(not (node-exists? tree idx)) traversal
(leaf? tree idx) (conj traversal (tree idx))
:else (apply conj
(do-traversal tree (left-child idx) traversal)
(tree idx)
(do-traversal tree (right-child idx) traversal)))))
When the expected traversal for a tree is [10 20 30] I instead get ([] 30 20
10 [])) in my unit test. Can someone explain to me why using let as I have
done does not work, and what another solution might be?
Thanks
- John
--
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your
first post.
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en