树总分支数计算问题:自定义方法结果与实际不符的技术求助
问题分析与解决方法
首先,咱们先明确问题核心:你要计算的是树中所有父节点到子节点的分支(边)总数,但你的代码遗漏了最顶层「根节点到第1层节点」的分支,这就是结果差3的原因。
先拆解你的代码问题
你的代码计算了:
nrow(unique(M[,1:2])) + nrow(unique(M[,1:3])) + nrow(unique(M[,1:4]))
这对应的是第1→2层、第2→3层、第3→4层的分支数,但漏掉了最关键的「根→第1层」的分支(这部分有3条,正好是18和21的差值)。
正确的计算逻辑
树的总分支数是每一层父节点到子节点的边数之和:
- 根节点 → 第1层:等于第1层的唯一节点数(因为根节点连接每个不同的第1层节点都算一条分支)
- 第1层 → 第2层:等于前两列的唯一组合数(每个唯一的(层1,层2)对应一条分支)
- 第2层 → 第3层:等于前三列的唯一组合数
- 第3层 → 第4层:等于全部四列的唯一组合数
实现代码
分步写法(清晰易懂)
# 根到第1层的分支数:第1列的唯一值数量 root_to_l1 <- nrow(unique(M[, 1, drop = FALSE])) # 第1→2层分支数 l1_to_l2 <- nrow(unique(M[, 1:2])) # 第2→3层分支数 l2_to_l3 <- nrow(unique(M[, 1:3])) # 第3→4层分支数 l3_to_l4 <- nrow(unique(M[, 1:4])) # 总分支数 total_branches <- root_to_l1 + l1_to_l2 + l2_to_l3 + l3_to_l4 total_branches # 输出结果为21,符合预期
简化写法(一行搞定)
sum(sapply(1:4, function(k) nrow(unique(M[, 1:k, drop = FALSE]))))
验证结果
咱们手动算一遍:
- 根→第1层:3条(第1列唯一值是1、2、3)
- 第1→2层:4条(前两列唯一组合是(1,1)、(2,2)、(3,2)、(2,1))
- 第2→3层:6条(前三列唯一组合共6种)
- 第3→4层:8条(四列全组合都是唯一的)
总和:3+4+6+8=21,完美匹配预期。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

