我需要使用迭代算法找到树中元素的数量,但我发现代码在概念上很难编写。
我的方法是从根节点开始并访问子节点,然后访问这些子节点的子节点,依此类推。
这是我编写的适用于小树的代码,但不是真正的解决方案,因为我需要为每个深度级别添加一个额外的块:
// 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;
答案 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;
}