递归树搜索获取节点层级

Recursive tree search to get the node level

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

  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))

那个returns我

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

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

提前致谢!

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

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)

这里可能是一个递归选项,您可以使用 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