<div>Dear Zeng,</div>
<div>&nbsp;</div>
<div>I am also new to Scheme/LISP but what I found was that recursive algorithms tend to make more sense in LISP than in C/C++/Java. This was my attemp at a binary tree ...</div>
<div>&nbsp;</div>
<div>
<p>(define null &#39;())</p>
<p>; ---- node object ----<br>(define (make-node data)<br>&nbsp; (cons data (cons null null)))<br>; ---- node object setters ----<br>(define (set-data! node data)&nbsp; (set-car! node data))<br>(define (set-lnode! node lnode)(set-car! (cdr node) lnode))
<br>(define (set-rnode! node rnode)(set-cdr! (cdr node) rnode))<br>; ---- node object getters ----<br>(define (get-data node) (car node))<br>(define (get-lnode node)(cadr node))<br>(define (get-rnode node)(cddr node))<br>
; ---- node predicates ----<br>(define (leaf? node)<br>&nbsp; (if (null? (and (get-lnode node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (get-rnode node)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #t<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #f))</p>
<p>(define (make-btree)<br>&nbsp; (let ((root null))<br>&nbsp;&nbsp;&nbsp; ; ---- data inserter ----<br>&nbsp;&nbsp;&nbsp; (define (insert! data)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (inserter cur-node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (let ((new-node (make-node data)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond ((null? cur-node)
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set! root new-node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((&gt; data (get-data cur-node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (null? (get-rnode cur-node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-rnode! cur-node new-node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (inserter (get-rnode cur-node))))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((&lt; data (get-data cur-node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (null? (get-lnode cur-node)) <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (set-lnode! cur-node new-node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (inserter (get-lnode cur-node)))))))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (inserter root))<br>&nbsp;&nbsp;&nbsp; ; ---- traversals ----<br>&nbsp;&nbsp;&nbsp; (define (pre-order-traversal)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (traverse node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (not (null? node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (display (get-data node))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse (get-lnode node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse (get-rnode node)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (display &quot;&quot;)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse root))</p>
<p>&nbsp;&nbsp;&nbsp; (define (post-order-traversal)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (traverse node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (not (null? node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse (get-lnode node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse (get-rnode node))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (display (get-data node)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (display &quot;&quot;)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse root))</p>
<p>&nbsp;&nbsp;&nbsp; (define (in-order-traversal)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (define (traverse node)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (not (null? node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse (get-lnode node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (display (get-data node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse (get-rnode node)))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (display &quot;&quot;)))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (traverse root))</p>
<p>&nbsp;&nbsp;&nbsp; (define (dispatch op)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (cond ((eq? op &#39;insert) insert!)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((eq? op &#39;root) root)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((eq? op &#39;pre-order-traversal) (pre-order-traversal))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((eq? op &#39;post-order-traversal) (post-order-traversal))
<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((eq? op &#39;in-order-traversal) (in-order-traversal))))<br>&nbsp;&nbsp;&nbsp; ; object interface<br>&nbsp;&nbsp;&nbsp; dispatch))</p>
<p>; export tree interface<br>(define (insert! tree data) ((tree &#39;insert) data))<br>(define (root tree) (tree &#39;root))<br>(define (pre-order-traversal tree) (tree &#39;pre-order-traversal))<br>(define (post-order-traversal tree) (tree &#39;post-order-traversal))
<br>(define (in-order-traversal tree) (tree &#39;in-order-traversal))<br><br>.... and to find the depth of a tree I use this</p>
<p>(define (depth tree)<br>&nbsp; (define (counter node)<br>&nbsp;&nbsp;&nbsp; (cond ((null? node) 0)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((leaf? node) 1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (else (+ 1 (max (counter (get-lnode node))<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (counter (get-rnode node)))))))
<br>&nbsp; (counter (root tree)))</p>
<p>which I translated from this Haskell code</p>
<p>depth :: Tree -&gt; Int<br>depth Empty&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 0<br>depth (Leaf n)&nbsp;&nbsp; = 1<br>depth (Node l r) = 1 + max (depth l) (depth r)</p>
<p>Hope it helps</p>
<p>Joshua Ewulo</p></div>
<div><span class="gmail_quote">On 31/07/07, <b class="gmail_sendername">Marco Morazan</b> &lt;<a href="mailto:morazanm@gmail.com">morazanm@gmail.com</a>&gt; wrote:</span>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">Dear Zeng,<br><br>May I suggest that you define, precisely, what you mean by a tree<br>first? This may be done by defining a BNF grammar for trees. Once you
<br>have a grammar for your trees, you can design code for performing your<br>favorite traversal of trees.<br><br>Let me get you started:<br><br>&lt;tree&gt; --&gt; empty<br>&lt;tree&gt; --&gt; ( ?????? )<br><br>Marco<br>
<br>On 7/31/07, Zeng Fucen &lt;<a href="mailto:zengfucen@gmail.com">zengfucen@gmail.com</a>&gt; wrote:<br>&gt; I&#39;m wrong!!!<br>&gt;<br>&gt; That&#39;s a binary tree,,,should be defined like this:((4 2 5) 1 (6 3 7))<br>
&gt;<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;---------------------<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3<br>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |<br>&gt; ------------&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ------------<br>&gt; 4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 7
<br>&gt;<br>&gt; I want result of the traversal is : 1 2 3 4 5 6 7&nbsp;&nbsp;,,, how to?<br>&gt;<br>&gt;<br>&gt; On 7月31日, 下午10时56分, &quot;Hans Oesterholt-Dijkema&quot; &lt;<a href="mailto:hdn...@gawab.com">hdn...@gawab.com</a>&gt;
<br>&gt; wrote:<br>&gt; &gt; Why don&#39;t you define a tree like this<br>&gt; &gt;<br>&gt; &gt; (1 (2 (4 () ()) (5 () ())) (3 (6 () ()) (7 () ()))<br>&gt; &gt;<br>&gt; &gt; ?<br>&gt; &gt;<br>&gt; &gt; --Hans<br>&gt; &gt;
<br>&gt; &gt; Op 31/7/2007 schreef &quot;Zeng Fucen&quot; &lt;<a href="mailto:zengfu...@gmail.com">zengfu...@gmail.com</a>&gt;:<br>&gt; &gt;<br>&gt; &gt; &gt;I&#39;m a scheme novice,<br>&gt; &gt;<br>&gt; &gt; &gt;I want to travel a binary tree, how to ? (depth first)
<br>&gt; &gt;<br>&gt; &gt; &gt;Thanks for your tips , first!<br>&gt; &gt;<br>&gt; &gt; &gt;I define a tree like this:&nbsp;&nbsp;(1 (2 4 5) (3 6 7))<br>&gt; &gt;<br>&gt; &gt; &gt;_________________________________________________<br>
&gt; &gt; &gt;&nbsp;&nbsp;For list-related administrative tasks:<br>&gt; &gt; &gt;&nbsp;&nbsp;<a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>&gt; &gt;<br>&gt; &gt; _________________________________________________
<br>&gt; &gt;&nbsp;&nbsp; For list-related administrative tasks:<br>&gt; &gt;&nbsp;&nbsp;<a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>&gt;<br>&gt; _________________________________________________
<br>&gt;&nbsp;&nbsp;For list-related administrative tasks:<br>&gt;&nbsp;&nbsp;<a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br>&gt;<br><br>_________________________________________________
<br>For list-related administrative tasks:<br><a href="http://list.cs.brown.edu/mailman/listinfo/plt-scheme">http://list.cs.brown.edu/mailman/listinfo/plt-scheme</a><br><br></blockquote></div><br>