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

如何移除嵌套列表表示的二叉树中的叶子节点?

递归移除嵌套列表二叉树中的空叶子节点

嘿,我来帮你搞定这个问题~先看看你原代码里的几个关键问题,再给你梳理正确的实现思路和代码。

原代码的问题点

你的代码里有几个容易踩的坑:

  • 循环时用for i in tree,接着取tree[i]是错误的——这里i是列表里的元素,不是索引,用元素当索引直接会报错;
  • 循环过程中直接pop(i)修改原列表,会打乱循环的迭代顺序,因为列表长度变了,后续元素的位置会偏移;
  • 递归的返回时机不对,刚处理一个子节点就直接return,没处理完当前节点的所有子节点就提前结束了;
  • 逻辑顺序颠倒了,应该先递归处理所有子节点,再处理当前节点的过滤,你正好反过来了。

正确的实现思路

递归处理这种嵌套结构的核心是先处理子节点,再处理当前节点:

  1. 遍历当前节点的每个子元素;
  2. 如果子元素是空列表(也就是我们要移除的空叶子),直接跳过它;
  3. 如果子元素是非空列表,先递归处理这个子元素,再把处理后的结果保留下来;
  4. 最后返回处理后的当前节点列表。

这样就能精准移除原始的空叶子节点,同时保留那些因为子叶子被移除而变成空列表的父节点。

实现代码

def removeLeaf(tree):
    processed_children = []
    for child in tree:
        if isinstance(child, list):
            # 遇到空叶子节点,直接跳过(移除)
            if child == []:
                continue
            # 非空列表节点,递归处理后加入结果
            processed_child = removeLeaf(child)
            processed_children.append(processed_child)
        else:
            # 如果二叉树包含非列表类型的节点,直接保留
            processed_children.append(child)
    return processed_children

测试验证

用你的输入示例测试:
输入:[[[[], []], [[], []]], [[], [], []]]
输出:[[[], []], []]
完全符合你的预期~

再举个额外例子,比如输入[[1, []], [[]], 2],处理后会得到[[1], [], 2],空叶子被移除,其他节点正常保留。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:23:30