问题是我想看看二叉树是否为N
我们调用二叉树,其中N是将包含所有节点列表的数字的数量。例如,这是二叉树2:
'((1 2) ((7 10) ((2 4) null null)) ((6 8) ((10 13) null null) null))
这是二叉树1:
'(2- (7- (2 null null) (6 (5 null null) (11 null null))) (5 null (9 (4 null null) null)))
我有这段代码:
(define (abN? arbol N) (
cond
[(= (length (list-ref list 0)) N) "Arbol Binario N" "No es un arbol binario N" ]
[(= (number? (car list)) N) "Arbol Binario 1" "No es un arbol binario 1" ]
)
)
然后把它放在控制台中:
(abN? '((1 2) ( (7 10) ( (2 4) null null) ) ((6 8) ((10 13) null null) null)) 2)
并给我这个错误
car: contract violation
expected: pair?
given: #<procedure:list>
我错了什么?
谢谢。
答案 0 :(得分:1)
您的代码中存在多个错误,请尝试以下操作:
(define (abN? arbol N)
(cond
[(number? (car arbol))
(if (= N 1)
"Arbol Binario 1"
"No es un arbol binario 1")]
[(list? (car arbol))
(if (= (length (car arbol)) N)
"Arbol Binario N"
"No es un arbol binario N")]
[else (error "Dato de entrada incorrecto")]))
说明:
arbol
,但在您的代码中,您将其称为list
(顺便提一下,它是一个内置函数)。这就是导致报告错误的原因list-ref
访问列表的第一个元素,而是使用car
cond
表达式的工作原理。每个条件评估为其后面的表达式的最后一个值,如果您需要测试其他条件,您必须使用if
或其他cond
内部,您似乎相信每个条件都有一个if-else
条件,而且不正确
对于可能的输入,它按预期工作:
(abN? '(1 ( (7 10) ( (2 4) null null) ) ((6 8) ((10 13) null null) null)) 1)
=> "Arbol Binario 1"
(abN? '(1 ( (7 10) ( (2 4) null null) ) ((6 8) ((10 13) null null) null)) 2)
=> "No es un arbol binario 1"
(abN? '((1 2) ( (7 10) ( (2 4) null null) ) ((6 8) ((10 13) null null) null)) 2)
=> "Arbol Binario N"
(abN? '((1 2) ( (7 10) ( (2 4) null null) ) ((6 8) ((10 13) null null) null)) 3)
=> "No es un arbol binario N"
(abN? '("bogus" ( (7 10) ( (2 4) null null) ) ((6 8) ((10 13) null null) null)) 3)
=> Unknown input