2014-08-28 16 views
1

我正在尝试从字符串输入中构造计划语言的树。以下是我已经尝试 -从符号输入构造树

(define travsal (lambda (tree) 
      (cond 
       ((null? tree) '()) 
       (#t (append (travsal (car tree)) (cons (cadr tree) 
(travsal (caddr tree)))))))) 

(define tree1 '(((() 4()) 2 (() 5())) 1 ((() 6()) 3 (() 7())))) 

    (display tree1) 
    (newline) 

    (travsal tree1) 

正如你可以看到它只是迭代所提供的输入,而不是做什么实际的二叉树应该做的。 对于如何使用节点和孩子从符号输入保存树来说,我感到非常震惊,例如 - (((()4())2(()5()))1((()6() )3(()7()))))“然后打印出来就像上面的功能正在打印。

请帮忙,我在接受采访时被问到这个问题,仍然无法解决它。

+1

现在他们在面试中提出了计划问题?太棒了!这份工作在哪里,我可以申请吗? :P – 2014-08-28 23:30:29

回答

0

你是什么意思“不做什么实际的二叉树应该做”? 。遍历代码很好,它正在执行树的in-order traversal。一些固定格式问题:

(define travsal 
    (lambda (tree) 
    (cond ((null? tree) '()) 
      (else (append (travsal (car tree)) 
         (cons (cadr tree) 
           (travsal (caddr tree)))))))) 

现在,请记住,你所提供的树是二进制的,但排序:

(define tree1 '(((() 4()) 2 (() 5())) 1 ((() 6()) 3 (() 7())))) 

如果我们画它,它会是这样的:

 1 
    / \ 
    2  3 
/\ / \ 
4  5 6  7 

其中,后中序遍历将正确地得到该结果使用travsal过程时:

(travsal tree1) 
=> '(4 2 5 1 6 3 7) 
+0

如果需要打印预订单或后期订单二叉树,则必须从头开始编写逻辑。相反,如果我可以先存储树并在其上应用输出逻辑。或者这会很好,我有什么? – 2014-08-29 00:58:11

+0

我不跟着你。你想如何“打印”它?是遍历还是实际绘图? 。如果您想从预订到后序订单切换,您需要编写一个不同的过程(但很简单,只需将参数的顺序更改为“append”,将根目录添加到列表中)。你使用的树形表示很好,没有必要将它存储在其他地方,你可以直接在其上应用输出逻辑。 – 2014-08-29 01:02:46

+1

谢谢奥斯卡,那会的。 – 2014-08-29 01:44:39