在 R 中,如何将层序树转换为预序树?

问题描述

我有一个列表,表示按级别顺序遍历的树。

一个数字是孩子的数量,第二个数字是它的“级别”,从 1 开始。

我希望程序输出一个与 matr 具有相同元素但按预序排列的列表。

Example

对于输入: 列表(c(4,1),c(0,2),c(2,c(1,3),3))

输出应该是: 列表(c(4,3))

我认为问题出在全局变量上?我已经在 Python 中运行了它,但在 R 中没有运行,据我所知,它们正在做同样的事情。

这就是我所拥有的:

matr = list(c(4,3))
tot = 3
new = list()

func <- function(new,matr,level,tot){
 if (level <= tot){
   for (i in 1:length(matr)){
     if (matr[[i]][2] == level){
       a = matr[[i]]
       matr = matr[-i]
       new = c(new,list(a))
       break
     }
   }
   if (a[1]!=0){
     for (i in 1:a[1]){
       func(new,level+1,tot)
     }
   }
 }
}
func(new,1,tot)

作为参考,以下代码执行我想要的操作(但它使用的是 Python 而不是 R)

matr = [[4,1],[0,2],[2,[1,3],3]]
tot=3
newm = []
def func(newm,level):
    if level <= tot:
        a = [k for k in matr if k[1] == level][0]
        newm.append(a)
        matr.remove(a)
        for i in range(a[0]):
            func(newm,level+1)
func(newm,1)
print(newm)

解决方法

没关系——解决了

if (level<=tot){
  for(i in 1:length(matr)){
    if (matr[[i]][2]==level){
      a = matr[[i]]
      assign("matr",matr[-i],envir=.GlobalEnv)
      break
    }
  }
  
  assign("newm",c(newm,list(a)),envir = .GlobalEnv)
  
  if (a[1]!=0){
    for (i in 1:a[1]){
      topreorder(level+1)
    }
  }
  
}