2014-08-28 55 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