如何对二叉树进行尾递归?

时间:2013-02-11 04:01:42

标签: recursion language-agnostic binary-tree tail-recursion

如果你有一个二叉树,你如何使用尾递归迭代(按顺序使用)?我知道尾部递归涉及您在迭代时计算新值,然后当您到达基本情况时,您只需返回累积。但是当你必须两次调用函数调用时,你如何为树做这个?

1 个答案:

答案 0 :(得分:7)

假设深度优先从左到右遍历,则不能对左侧分支使用尾递归,但可以将其用于右侧分支。

示例方案代码(假设您的tree有三个访问者函数,valueleftright):

(define (collect-in-order tree)
  (define (collect node result)
    (if node
        (collect (right node)
                 (cons (value node)
                       (collect (left node) result)))
        result))
  (reverse (collect tree '())))

(collect (right node) ...)处于尾部位置,因此这是一个尾调用。

你也可以进行从右到左的遍历,在这种情况下,它是向左递归的尾递归:

(define (collect-in-order tree)
  (let collect ((node tree)
                (result '()))
    (if node
        (collect (left node)
                 (cons (value node)
                       (collect (right node) result)))
        result)))