如何移除嵌套列表表示的二叉树中的叶子节点?
递归移除嵌套列表二叉树中的空叶子节点
嘿,我来帮你搞定这个问题~先看看你原代码里的几个关键问题,再给你梳理正确的实现思路和代码。
原代码的问题点
你的代码里有几个容易踩的坑:
- 循环时用
for i in tree,接着取tree[i]是错误的——这里i是列表里的元素,不是索引,用元素当索引直接会报错; - 循环过程中直接
pop(i)修改原列表,会打乱循环的迭代顺序,因为列表长度变了,后续元素的位置会偏移; - 递归的返回时机不对,刚处理一个子节点就直接
return,没处理完当前节点的所有子节点就提前结束了; - 逻辑顺序颠倒了,应该先递归处理所有子节点,再处理当前节点的过滤,你正好反过来了。
正确的实现思路
递归处理这种嵌套结构的核心是先处理子节点,再处理当前节点:
- 遍历当前节点的每个子元素;
- 如果子元素是空列表(也就是我们要移除的空叶子),直接跳过它;
- 如果子元素是非空列表,先递归处理这个子元素,再把处理后的结果保留下来;
- 最后返回处理后的当前节点列表。
这样就能精准移除原始的空叶子节点,同时保留那些因为子叶子被移除而变成空列表的父节点。
实现代码
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
相关产品推荐
相关产品推荐

