functional programming - Find Maximum from a Tree -


i trying find maximum number given tree:

(define-struct (some t)   ([value : t]))  (define-type (option t)   (u 'none (some t)))  (define-type bst (u 'e nd))  (define-struct nd   ([root : integer]    [lsub : bst]    [rsub : bst]))  (: maxi : bst integer -> integer) (define (maxi x acc)   (match x         ('e acc) ((nd ro ls rs)     (cond       ((> ro acc) (maxi ls ro))       (else        (maxi rs acc)))))) 

the above quote not work when enter following:

(maxi (nd 1 (nd 2 (nd 4 (nd 8 'e 'e) (nd 9 'e 'e)) (nd 5 'e 'e)) (nd 3 (nd 6 'e 'e) (nd 7 'e 'e))) 0)

can please help?

thank you!

so here test:

(maxi    (nd       1       (nd 2          (nd 4             (nd 8 'e 'e)             (nd 9 'e 'e))          (nd 5 'e 'e))       (nd 3          (nd 6 'e 'e)          (nd 7 'e 'e)))    0) 

and here happens:

   acc  root   do?   ---------------------------------    0    1      go left acc = root    1    2      idem    2    4      idem    4    8      idem    8    e      return 8 

if expect input trees satisfy binary search tree property, stating values on left subtree greater root , values of right subtree smaller or equal, test tree malformed bst, since 9 greater 4.

by way, if had bst, maximal value located?

if tree random tree, have compute maximum of both subtrees , root value before being able determine overall maximal value.

basically, want do:

(tree-max (nd root left right)) = (max root                                         (tree-max left)                                         (tree-max right)) 

if want recursively, encounter problem in base case because have provide maximal value empty leaf node: value pick make code incorrect tree contains values strictly below value. choose 0 , compute max of tree strictly negative numbers, 0 wrong answer because not appear in tree (what do?).

you can choose use accumulator instead of recursion, in case need 2 accumuators: maximum far , list of subtrees visit next. replace call stack heap-allocated stack.

i can't test following code, here possible implementation:

(define tree-max (tree greatest todo)   (match tree     ('e greatest (if (null? todo)                   greatest                  (tree-max (first rest)                             greatest                             (rest todo))     ((nd root left right) (tree-max left                                     (max greatest root)                                      (cons right todo)))) 

Comments

Popular posts from this blog

sql server - Cannot query correctly (MSSQL - PHP - JSON) -

php - trouble displaying mysqli database results in correct order -

C++ Linked List -