You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于完全二叉树结构DataFrame,从后往前生成不同长度配对值向量

解决方案:从二叉树结构DataFrame生成反向连续配对向量

没问题!我完全懂你要实现的需求——从这个类完全二叉树的父-子映射DataFrame里,从叶子节点开始回溯到根,生成不同长度的连续节点配对向量对吧?咱们用Python结合pandas来一步步实现:

第一步:构建示例数据

先把你给出的示例DataFrame搭起来,方便后续测试:

import pandas as pd

df = pd.DataFrame({
    'Parent': ['A', 'B', 'B', 'A'],
    'Daughter': ['B', 'C', 'D', 'E']
})

第二步:定位所有叶子节点

叶子节点就是那些没有作为父节点出现过的子节点,咱们先把它们找出来:

# 获取所有父节点的集合
parent_nodes = set(df['Parent'])
# 筛选出不在父节点集合里的子节点,就是叶子
leaf_nodes = df[~df['Daughter'].isin(parent_nodes)]['Daughter'].tolist()
# 这里得到的结果是 ['C', 'D', 'E']

第三步:写一个回溯路径的函数

我们需要一个工具函数,输入任意节点,就能返回从它到根节点的完整路径(顺序是叶子→父→祖父…→根,也就是你说的“从后往前”):

def get_full_path(node, df):
    path = [node]
    while True:
        # 查找当前节点的父节点
        parent_row = df[df['Daughter'] == node]
        if parent_row.empty:
            # 没有父节点,说明到根了,停止循环
            break
        parent = parent_row['Parent'].iloc[0]
        path.append(parent)
        node = parent
    return path

比如调用get_full_path('C', df)会得到['C', 'B', 'A'],调用get_full_path('E', df)会得到['E', 'A']。

第四步:生成不同长度的连续配对向量

接下来我们遍历每个叶子节点,回溯路径后,用滑动窗口的方式生成所有不同长度的连续节点序列:

# 用字典按长度分组存储结果,看起来更清晰
from collections import defaultdict

result = defaultdict(list)

for leaf in leaf_nodes:
    path = get_full_path(leaf, df)
    # 生成长度从2到路径最大长度的所有连续子序列
    for seq_length in range(2, len(path) + 1):
        # 滑动窗口取连续的seq_length个节点
        for start_idx in range(len(path) - seq_length + 1):
            current_seq = path[start_idx:start_idx + seq_length]
            result[seq_length].append(current_seq)

# 对每个长度下的序列去重(避免不同叶子共享路径导致重复)
for length in result:
    # 先转成元组才能去重,再转回列表
    unique_seqs = list(set(tuple(seq) for seq in result[length]))
    result[length] = [list(seq) for seq in unique_seqs]

查看结果

运行完上面的代码后,咱们打印结果看看:

for length, sequences in result.items():
    print(f"🔹 长度为 {length} 的连续配对向量:")
    for seq in sequences:
        print(f"   {seq}")

输出会是:

🔹 长度为 2 的连续配对向量:
   ['C', 'B']
   ['B', 'A']
   ['D', 'B']
   ['E', 'A']
🔹 长度为 3 的连续配对向量:
   ['C', 'B', 'A']
   ['D', 'B', 'A']

这个结果完全符合你的需求:从叶子节点开始(后)往根节点(前)生成了不同长度的连续节点配对,每个长度下的向量都是连续的节点序列。

内容的提问来源于stack exchange,提问作者Dan Adams

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:38:41