2013-05-16 2 views
1

RACKET/DR을 사용하여 이진 트리에 대한 inorder traversal 알고리즘을 작성하려고합니다. 라켓이진 트리 inorder traversal Racket

(define (print-records node number) 
     (cond 
     [(not (empty? node-left))(print-records (node-left node) number)] 
     *Do This before moving to next IF clause* 
     [(not (empty? node-right))(print-records(node-right node) number)] 

    )) 

나는 다음과 같은 알고리즘

InOrder(node) 
if node is null return 
InOrder(node.left) 
Print(node) 
InOrder(node.Right) 

내 문제가 COND을 통해 내가 한 표현을 실행할 수 있으며 나머지를 건너 뛸 것입니다 따라야하는 것을 시도하고있다. 나는 두 개의 표현식을 하나의 예제 아래에 추가하려고 시도했다 (예 : (a) (b)). 나 또한 도우미 절차를 만들려고했지만 그 중 하나가 작동하지 않았다.

답변

2

cond을 잘못 사용하고 있습니다. 재귀 적으로 트리의 왼쪽 부분을 트래버스 한 다음 현재 노드를 방문한 다음 재귀 적으로 트리의 오른쪽 부분을 트래버스해야합니다. 트리가 상호 배타적 인 대안이 아니라는 점에서 세 단계를 정확히 순서대로 수행해야합니다. 대신이 같은 것을보십시오 :

(define (print-records node number) 
    (unless (empty? (node-left node)) 
    (print-records (node-left node) number)) 
    (print (node-value node)) ; replace this line with the actual printing code 
    (unless (empty? (node-right node)) 
    (print-records (node-right node) number))) 

일부 설명 :

  • (unless <condition> <body>)(cond ((not <condition>) <body>)) 단지 속기이다.
  • 두 번의 재귀 호출간에 실제 탐색 작업이 수행됩니다.이 경우에는 (print (node-value node))을 씁니다. 예를 들어,이 행을 현재 노드 값의 실제 인쇄 코드로 바꿉니다.
  • number 매개 변수를 사용하여 무엇을 하려는지 명확하지 않습니다. 전달되지 않고 사용되지 않았기 때문입니다.
+0

그것은 * 인쇄 * 기능에 문제가 있습니다. 그것은 하나의 표현을 기대하지만, 당신이 2 개의 추가 (조건을 생각한 후에) – Achilles

+1

@Achilles 위에서 말했듯이 : 그것은 단지 예일뿐입니다. 어떤 인쇄 기능을 사용해야할지 모르겠다. 그 줄을 실제 코드로 교체하라. 내 대답을 다시 읽으십시오, 제가 그것을 명확하게하기 위해 편집했습니다. –

+0

그 라인에서 나는 기본적으로 사용자에게 출력을 출력하는 함수를 호출하고자한다. (인쇄 할 것을 선택하기 전에 "숫자"와 노드 값의 비교를한다.) – Achilles

2

매우 일반적인 작업입니다. 일반 프로 시저를 작성한 다음 각 노드에 적용 할 함수로 특수화 할 수 있습니다.

(define (walker node function) 
    (unless (empty? node) 
    (walker (node-left node) function) 
    (function node) 
    (walker (node-right node) function))) 

참고 :이 함수의 시작 부분에 empty?를 확인하기 좋다.

(define (print-records node number) 
    (walker node (compose print node-value))) ; ignore number, it seems. 

당신은 또한이 일할 수 :

(define (walking-with function) 
    (letrec ((walker (lambda (node) 
        (unless (empty? node) 
         (walker (node-left node)) 
         (function node) 
         (walker (node-right node)))))) 
    walker)) 
(define print-records-for (walking-with (compose print node-value))) 
(print-records-for node) 
> ... 
관련 문제