【问题标题】:Using R nested lists as simple binary tree使用 R 嵌套列表作为简单的二叉树
【发布时间】:2017-10-24 20:59:33
【问题描述】:

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

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

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

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&lt;-list(list(list(35,40),list(10,30)),5)

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

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

【问题讨论】:

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


    【解决方案1】:

    您可以使用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" 
    

    【讨论】:

    • 我之前已经做到了这一点。从那以后玩得更多,我仍然没有弄清楚如何在那个深度获得叶子的路径/索引,正如我的问题中提到的那样: ?_您知道一种利用data.tree结构实现这一目标的方法,而无需手动遍历所有分支吗?我的问题的核心与获取最深叶子的位置有关。非常感谢您迄今为止的帮助!
    • 完美。太感谢了。仍然想在某个时候找到一种使用原生列表的聪明方法,但这对我的目的很有效!一旦我弄清楚如何将其标记为答案。
    【解决方案2】:

    听起来你已经成功了一半。每当您找到最深的节点时,您都​​可以将索引输出到列表中。这是伪代码中的递归函数,因为我不知道 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
    

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 2017-05-24
      • 1970-01-01
      • 2020-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多