迭代地遍历树以找到大小

时间:2011-11-21 17:06:57

标签: java tree iteration

我需要使用迭代算法找到树中元素的数量,但我发现代码在概念上很难编写。

我的方法是从根节点开始并访问子节点,然后访问这些子节点的子节点,依此类推。

这是我编写的适用于小树的代码,但不是真正的解决方案,因为我需要为每个深度级别添加一个额外的块:

// Start the counter at 1 because the root node counts
int size = 1;

for(ITree child1 : root) {
    size++;
    for(ITree child2 : child1) {
        size++;
        for(ITree child3 : child2) {
            size++;
            for(ITree child4 : child3) {
                size++;
                for(ITree child5 : child4) {
                    size++;
                }
            }
        }
    }
}
return size;

3 个答案:

答案 0 :(得分:11)

从概念上讲,保持堆栈(LinkedList等)。对于每个孩子(现在,您的孩子循环),添加到堆栈。继续循环遍历堆栈,直到它最终为空。

这未经过测试,但这应该完全符合您的要求。我只是使用java.io.File而不是你的“ITree”,因为这是我可以编译的东西:

int sizeOfTree(File root){
    // Start the counter at 1 because the root node counts

    int size = 1;

    LinkedList<File> stack = new LinkedList<File>();
    stack.add(root);

    while(!stack.isEmpty()){
        File f = stack.remove();
        for(File child : f.listFiles()){
            size++;
            stack.add(child);
        }
    }

    return size;
}

答案 1 :(得分:1)

使用递归数据结构

实际上不可能迭代遍历递归数据结构,就像带有指针的树一样 - 这是因为对象“隐藏”了它们的底层数据元素。

使用不同的数据结构

所有树都可以存储/实现为线性数组数据结构,其中索引可以使用指数数学计算:

例如,树[0,1,2,3,null,4,null]将描述在根处具有0的树,其中0具有直接子节点1和2.然后1已经离开子节点“3 “,2和2让孩子”4“。

因此,如果以这种方式存储树,则元素的数量自然是数组中非空元素的数量。

更简单地说:将树存储在线性结构中,您可以在任何给定时间知道长度,而无需进行任何类型的花哨算法。

答案 2 :(得分:1)

你的任务的关键词是递归。 Tree是一个经典的递归结构,因此您应该编写接受根节点的递归方法,计算此节点的大小,然后为所有子节点调用自身。这是伪代码:

public int getSize(ITree root) {
    return getSize(root, 0);
}

private int getSize(ITree node, int size) {
    size++;
    for(ITree child : node.children()) {
        size += getSize(child, size)
    }
    return size;
}