Java 获取二叉树特定级别的所有节点

Java 获取二叉树特定级别的所有节点,java,recursion,binary-tree,Java,Recursion,Binary Tree,我有一个二进制树,我想获取特定级别的所有节点。秩序并不重要。我想尝试用递归来实现这一点。我的方法如下所示: public List<T> getNodesOnLevel(int i){ int recursionTool = i //to do recursionTool-=1 } class Node<T>{ T val; Node<T> left; Node<T> right;

我有一个二进制树,我想获取特定级别的所有节点。秩序并不重要。我想尝试用递归来实现这一点。我的方法如下所示:

public List<T> getNodesOnLevel(int i){
    int recursionTool = i
    //to do
    recursionTool-=1
    }
class Node<T>{
    T val;
    Node<T> left;
    Node<T> right;
    Node(T v){
        val = v;
        left = null;
        right = null;
    }
public List getNodesOnLevel(inti){
int递归工具=i
//做
递归工具-=1
}
我试图在while(recursionTool!=0){method…,然后是recursionTool-1} 但我最终得到了所有节点,直到达到所需级别。 我的节点如下所示:

public List<T> getNodesOnLevel(int i){
    int recursionTool = i
    //to do
    recursionTool-=1
    }
class Node<T>{
    T val;
    Node<T> left;
    Node<T> right;
    Node(T v){
        val = v;
        left = null;
        right = null;
    }
类节点{
T值;
左淋巴结;
节点权;
节点(TV){
val=v;
左=空;
右=空;
}

这可能会对您有所帮助。我已将此方法用于打印节点,但您可以更改它

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);
    }
}

通过连接递归调用返回的列表,可以将其实现为纯函数算法。不幸的是,在Java中,这是相当低效的,因为所有检索到的值都是通过列表创建或连接在每个递归级别复制一次的

如果您愿意使用变异,这里有一个避免复制的解决方案(假设
节点
):

private void getNodesOnLevel(int级别,列表){
if(node==null)返回;
如果(级别==0){
list.add(this.val);
}否则{
this.left.getNodesOnLevel(级别-1,列表);
this.right.getNodesOnLevel(级别-1,列表);
}
}
需要使用空(可变)列表作为第二个参数来调用上述方法,因此我们需要另一个方法:

public List<T> getNodesOnLevel(int level) {
    List<T> list = new ArrayList<>();
    this.getNodesOnLevel(level, list);
    return list;
}
public List getNodesOnLevel(int级别){
列表=新的ArrayList();
this.getNodesOnLevel(level,list);
退货清单;
}
(就复杂性而言,纯函数解是
O(LN)
,其中
L
是级别,
N
是该级别的节点数。我的解是
O(N)
。由于
ArrayList.append
实现列表大小调整的方式,列表中的每个值将平均复制两次。可以通过创建容量为2
级别的列表来避免调整大小)