为R中的k个序数生成所有二叉树

时间:2012-06-18 19:53:56

标签: r binary-tree

假设给定R中的序数列表,我想生成所有有序二进制树作为< = 2列表的递归列表。

因此,例如,给定list(2,1,4,3),输出将为:

list(list(1, list(2, list(3, 4))),
     list(1, list(list(2, 3), 4)),
     list(list(1, 2), list(3, 4)),
     list(list(1, list(2, 3)), 4),
     list(list(list(1, 2), 3), 4))

列出树木的顺序并不重要。排序不是问题,但我在进行功能递归方面遇到了很多困难。我知道R在递归方面很慢,但速度不是问题,因为我正在处理相当低(< = 7)的订单。

1 个答案:

答案 0 :(得分:1)

这个功能应该让你去。它接受你给它的任何列表,并输出所有二进制树,按照给定的顺序保留列表中的项目:

trees <- function(l) {
    if (length(l) <= 1)
        return(l)
    if (length(l) <= 2)
        return(list(l))

    unlist(lapply(2:(length(l)), function(i) {
        left.trees <- trees(l[1:(i-1)])
        right.trees <- trees(l[i:length(l)])
        apply(expand.grid(1:length(left.trees), 1:length(right.trees)), 1, function(idx) {
            list(left.trees[[idx[1]]], right.trees[[idx[2]]])
        })
    }), recursive=FALSE)
}

所以你给的例子是:

> dput(trees(as.list(1:4)))
list(list(1L, list(2L, list(3L, 4L))), list(1L, list(list(2L, 
    3L), 4L)), list(list(1L, 2L), list(3L, 4L)), list(list(1L, 
    list(2L, 3L)), 4L), list(list(list(1L, 2L), 3L), 4L))