【问题标题】:Recursive tree search to get the node level递归树搜索以获取节点级别
【发布时间】:2021-04-08 13:26:51
【问题描述】:

我有一个数据集,其中包含一棵类似于下面的树。

  son father
1   1     NA
2   2      1
3   3      1
4   4      2
5   5     NA
6   6      2
7   7      4
8   8      5
9   9      4

构建了一个函数,让我可以搜索节点(子)的整个层次结构

getTree = function(sons){
   if( length(sons) > 0 ){
      sons = subset(df, father %in% sons)[['son']]
      sons = c(sons, getTree( sons ))
   }

   return(sons)
}

subset(df, son %in% getTree(8))

我回来了

  son father
4   4      2
6   6      2
7   7      4
9   9      4

但是,除了层次结构之外,还需要知道该节点(子节点)在树的哪个级别。如何更改或创建另一个功能来实现此目的?

提前致谢!

【问题讨论】:

  • 你只需要在你的函数中添加一个深度计数器参数,每次递归调用都会增加 1。
  • 谢谢兰迪!我什至尝试过这个想法,我只是无法在函数调用中传递这个计数器。这怎么可能?

标签: python r tree binary-tree binary-search-tree


【解决方案1】:

我不确定您的函数到底要在树中找到什么,但这里有一个 Python 示例,它可以在表中找到最深的子节点以及深度。它在每次调用时使用一个递增的计数器来跟踪深度:

In [140]: def traverse(sons, depth=0):
     ...:     next_sons = sons[sons['father'].isin(sons['son'])]
     ...:     if len(next_sons) > 0:
     ...:         return traverse(next_sons, depth+1)
     ...:     return sons, depth

In [141]: traverse(df)
Out[141]:
(   son  father
 7    7     4.0
 9    9     4.0,
 3)

【讨论】:

    【解决方案2】:

    这可能是您使用data.frame 跟踪节点级别的一种递归选项,即

    f <- function(sons) {
      getTree <- function(s.df) {
        repeat {
          sons <- subset(
            df,
            father %in% s.df$sons[s.df$lvl == max(s.df$lvl)]
          )[["son"]]
          if (length(sons) == 0) {
            return(s.df)
          }
          p <- data.frame(sons = sons, lvl = max(s.df$lvl) + 1)
          s.df <- rbind(s.df, getTree(p))
        }
      }
      getTree(data.frame(sons = sons, lvl = 0))
    }
    

    输入参数sons的级别始终从0开始到函数f,这样

    > f(1)
      sons lvl
    1    1   0
    2    2   1
    3    3   1
    4    4   2
    5    6   2
    6    7   3
    7    9   3
    
    > f(2)
      sons lvl
    1    2   0
    2    4   1
    3    6   1
    4    7   2
    5    9   2
    
    > f(5)
      sons lvl
    1    5   0
    2    8   1
    

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 1970-01-01
      • 2017-10-30
      • 2012-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-22
      • 2018-03-19
      相关资源
      最近更新 更多