寻找二叉树的叶子节点
难度:
标签:
题目描述
代码结果
运行时间: 27 ms, 内存: 15.9 MB
/*
* 题目:寻找二叉树的叶子节点
* 思路:
* 1. 使用递归的方法遍历二叉树。
* 2. 在遍历过程中,将叶子节点加入一个列表。
* 3. 使用Java Stream将叶子节点收集到一个新的列表中。
*/
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class FindLeavesStream {
public List<Integer> findLeaves(TreeNode root) {
return findLeavesHelper(root).collect(Collectors.toList());
}
private Stream<Integer> findLeavesHelper(TreeNode node) {
if (node == null) return Stream.empty();
if (isLeaf(node)) {
return Stream.of(node.val);
} else {
return Stream.concat(findLeavesHelper(node.left), findLeavesHelper(node.right));
}
}
private boolean isLeaf(TreeNode node) {
return node.left == null && node.right == null;
}
}
解释
方法:
这个题解的思路是使用递归的方式遍历二叉树,在递归过程中计算每个节点距离叶子节点的高度(最大深度)。将相同高度的节点的值存储在同一个列表中,最终得到按高度分组的叶子节点列表。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在这个算法中,如何确保所有叶子节点都被正确地分类到最底层的列表中?
▷🦆
递归函数`maxDepth`返回的是从当前节点到叶节点的最大深度,那么在递归过程中,如何处理只有左子树或只有右子树的情况?
▷🦆
在算法中,列表`self.res`的索引是如何与节点的高度对应起来的?具体地,为什么用`h-1`作为索引?
▷🦆
为什么在添加新列表到`self.res`时,要检查`len(self.res) < h`?这种情况下,是否可能出现`self.res`长度大于`h`的情况?
▷