繁体   English   中英

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

[英]Get all nodes of a specific level of a Binary Tree

我有一个BinaryTree ,我想获取特定级别的所有节点。 顺序无所谓。 我想尝试用递归来做到这一点。 我的方法如下所示:

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

通过连接递归调用返回的列表,可以将其实现为纯函数算法。 不幸的是,这在 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 level的列表来避免调整大小。)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM