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
Post a Comment