我有一个 BinaryTree,我想获取特定级别的所有节点。顺序无关紧要。我想尝试使用 recursion 来做到这一点。我的方法是这样的:
public List<T> getNodesOnLevel(int i){
int recursionTool = i
//to do
recursionTool-=1
}
我尝试了 while(recursionTool != 0){ method.... 然后是 recursionTool -1} 但我最终获得了所有节点直到想要的级别。 我的节点如下所示:
class Node<T>{
T val;
Node<T> left;
Node<T> right;
Node(T v){
val = v;
left = null;
right = null;
}
答案 0 :(得分:2)
通过连接递归调用返回的列表,可以将其实现为纯函数算法。不幸的是,这在 Java 中效率很低,因为在每个递归级别,所有检索到的值都通过列表创建或连接进行复制。
如果您愿意使用变异,这里有一个避免复制的解决方案(假设 this
是一个 Node<T>
):
private void getNodesOnLevel(int level, List<T> list) {
if (node == null) return;
if (level == 0) {
list.add(this.val);
} else {
this.left.getNodesOnLevel(level - 1, list);
this.right.getNodesOnLevel(level - 1, list);
}
}
需要使用空(可变)列表作为第二个参数调用上述方法,因此我们需要另一个方法:
public List<T> getNodesOnLevel(int level) {
List<T> list = new ArrayList<>();
this.getNodesOnLevel(level, list);
return list;
}
(在复杂性方面,纯函数解决方案是 O(LN)
,其中 L
是级别,N
是该级别的节点数。我的解决方案是 O(N)
. 由于 ArrayList.append
实现列表大小调整的方式,列表中的每个值平均将被复制两次。通过创建容量为 2{{ 的列表可以避免调整大小 1}}.)
答案 1 :(得分:1)
这可能对您有所帮助。我已经将这种方法用于打印节点,但您可以更改它。
public void printGivenLevel(TNode root, int level) {
if (root == null)
return;
if (level == 1 && root.getValue() != null) {
// here, add root.getValue() to list
} else if (level > 1) {
printGivenLevel(root.getLeft(), level - 1);
printGivenLevel(root.getRight(), level - 1);
}
}