我和我的朋友正在努力在Scheme中創建二進制搜索樹。我們無法保存我們插入的內容。我的教授說我們要用set-car! (CDR(左子樹莫名其妙,但我不知道到底哪裏把它。我們都應該使用設定的車!(CDDR(爲右子樹也。二進制搜索樹計劃
我們已經做了這一切到目前爲止正確的,但我們只是需要幫助使其成爲拯救我們的插入節點
代碼:
(define make-empty-BST '())
;create function to see if BST is empty
(define (emptyBST? BST) (null? BST))
;make non-empty BST with explicit list implementation
(define (make-BST root left-subtree right-subtree)
(list root left-subtree right-subtree))
;helper get root function
(define (getRoot BST) (car BST))
;helper get left subtree function
(define (getLeftsubTree BST) (cadr BST)) ;(car (cdr tr))
;helper get right subtree function
(define (getRightsubTree BST) (caddr BST)) ;(car (cdr (cdr tr)))
;Checks to see if a leaf is empty
(define (emptyleaf? BST) (and (null? (getLeftsubTree BST)) (null? (getRightsubTree BST))))
;inserts an item into the BST
(define (BST-insert BST item)
(cond
((emptyBST? BST) ;if empty, create a new root with given item - use empty lists for left and right subtrees
(make-BST item make-empty-BST make-empty-BST))
((< item (getRoot BST)) ;if item less than root, add to left subtree
(make-BST (getRoot BST)
(BST-insert (getLeftsubTree BST) item) ;recursion
(getRightsubTree BST)))
((> item (getRoot BST))
(make-BST (getRoot BST)
(getLeftsubTree BST)
(BST-insert (getRightsubTree BST) item)))
(else BST))) ; it's already in BST, do nothing
這是使用Dr.Retet和R5RS。 – Jared
目前,您的BST插入正在返回與舊樹共享結構的新樹,而不是更新現有樹。你明白爲什麼?您應該只在葉子上創建一個新的樹節點,並且應該只分配其父節點的左側或右側子節點。 –
你有沒有看過[插入節點鍵和二進制搜索樹使用方案中的值](http://stackoverflow.com/q/12910579/1281433)? [使用set!在drscheme](http://stackoverflow.com/q/4416862/1281433)中更改變量的值也是相關的(雖然質量不高)。 –