使用R嵌套列表作为简单二叉树

时间:2017-10-24 20:59:33

标签: r tree binary-tree depth-first-search nested-lists

我有一个简单的问题约束到R.我有一个实际上是一种二叉树,其中只有终端叶子具有与它们相关的值。可以看到一个玩具示例here.
基本上,我在具有最大深度的叶子之间执行操作(在深度中,顺序无关紧要)。我已经在这里添加了它,但实际上,它们已经被插入到一个更复杂的公式中 我的代码仅限于R.这个结构可以用这个命令表示,虽然我是通过其他方式获得的:

testBranch<-list(list(list(list(20,15),40),list(10,30)),5) #Depth of 4

我有一个工作函数来确定最深层的深度,但R中的嵌套列表是令人难以置信的。任何线索如何有效地找到索引的集合来访问最深的值?例如,在上面的玩具示例中

testBranch[[1]][[1]][[1]]

会给我我想要的东西,一个包含2个元素的列表。使用我的附加示例,我可以这样做:

indexesOI<-getIndexes(testBranch) testBranch[indexesOI]<-testBranch[indexesOI][1]+testBranch[indexesOI][2] #testBranch now has depth of 3

导致toy example,中与步骤1相对应的树,可以用R表示:

testBranchStep1<-list(list(list(35,40),list(10,30)),5)

如果需要,我愿意使用包。只是不想在R中重写整个节点类/ dfs,因为我对类系统没有太多经验。我已经研究过data.tree,但没有运气将我的嵌套列表强制转换为他们的数据结构。

您可以提供的任何帮助都会很棒!原谅匆忙制作的ASCII树。我基本上是自学成才,并没有在这里问过很多问题,所以如果我需要调整格式,请告诉我!谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用data.tree执行此操作。

library(data.tree)
testBranch <- list(list(list(list(20,15),40),list(10,30)),5)
tree <- FromListSimple(testBranch)
tree

这将打印树:

      levelName
1 Root         
2  °--1        
3      ¦--1    
4      ¦   °--1
5      °--2 

data.tree提供了许多实用功能和属性(请务必阅读小插图)。要了解深度,请特别使用:

height <- tree$height

哪个收益率:

> 4

然后,您可以遍历树并找到具有最大高度的节点:

maxDepthLeaves <- Traverse(tree, filterFun = function(node) node$level == height)

此遍历是最高级别的节点列表(在这种情况下只有一个Node)。然后,您可以使用Get从遍历中检索任何值,例如namepositionpathString

Get(maxDepthLeaves, 'pathString')
           1 
"Root/1/1/1" 

显示为:

class Application {
    public Application() {...}

    public void doSomething(final String logs) {
        final String[] lines = logs.split("\\n");
        for (final String line: lines) {
           // Pass the line to every single checkForProp# item and do something with the response
        }
    } 

    private Optional<Action> checkForProp1(final String line) {
       // Check if line has certain thing
       // If so return an Action
    }

    // More of these "checks" here
}

答案 1 :(得分:0)

听起来你就在那里。只要找到最深的节点,就可以将索引输出到列表中。这是伪代码中的递归函数,因为我不知道R。

If tree is a leaf node
   If current depth is greater than max-depth
      Delete list of indices
      Append current index into list of indices
   If current depth is equal to max-depth
      Append current index into list of indices
Else
   for each element in the tree
      Get current index
      Recursively call this function, passing in the current index