我有一个简单的问题约束到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树。我基本上是自学成才,并没有在这里问过很多问题,所以如果我需要调整格式,请告诉我!谢谢!
答案 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
从遍历中检索任何值,例如name
,position
或pathString
:
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