随机走过一棵二叉树?

时间:2013-03-27 00:39:12

标签: random tree scheme binary-tree

我正在创建一个程序,它接受一个树并随机选择一个分支(左或右)并在列表中返回这些值。由于某种原因,它不起作用。有什么帮助吗?

示例:

~(rand-walk (tree 1 (leaf 2) (leaf 3)))
(1 2)

这是我到目前为止所做的:

(define (rand-walk tr)
 (if (empty-tree? tr) '()
   (if (leaf? tr) tr
      (if (equal? (random 1) 0)
              (cons ((root-value tr)(root-value (left-subtree tr))) '())
              (cons ((root-value tr)(root-value (right-subtree tr))) '())))))

3 个答案:

答案 0 :(得分:1)

免责声明:我从未在计划中写过,但15年前我与LISP进行了短暂的会面=)

您的递归部分不是递归的。您应该在子树上调用rand-walkcons

          (cons ((root-value tr)(rand-walk (left-subtree tr))) '())
          (cons ((root-value tr)(rand-walk (right-subtree tr))) '())))))

答案 1 :(得分:1)

如果你想遍历它,那么当你到达一片叶子时你应该返回一个列表:

(if (leaf? tr) (cons tr '())

在你的递归步骤中,你应cons进行一些递归调用:

(cons (root-value tr) (rand-walk (left-subtree tr)))

答案 2 :(得分:1)

您的代码中存在许多问题。这是一个正确的实现:

(define (rand-walk tr)
 (cond ((empty-tree? tr) '())
       ((leaf? tr) (list (root-value tr)))
       ((equal? (random 1) 0)
        (cons (root-value tr) (rand-walk (left-subtree tr))))
       (else
        (cons (root-value tr) (rand-walk (right-subtree tr))))))

如果我写这篇文章,我会使用尾递归方法:

(define (rand-walk tr)
  (assert (not (empty-tree? tr)))
  (let walking ((l '()) (tr tr))
    (let ((value (root-value tr)))
      (if (leaf? tr)
          (reverse (cons value l))
          (walking (cons value l))
                   ((if (zero? (random 1)) left-subtree right-subtree) tr))))))