Java:找到N-ary树的高度

时间:2013-11-19 22:43:54

标签: java tree height

找到二叉树的高度有很多;如何在Java中找到n-ary树的高度?它是否涉及遍历它并跟踪最大深度或类似的东西?

2 个答案:

答案 0 :(得分:1)

实际找到高度的N-ary树的高度与其他任何类型的树没有什么不同。叶节点的高度为0,非叶节点的高度比其子节点的高度高一个。

在伪代码中有一个递归函数在Java中执行此操作:

public static int getHeight(Node n){
    if(n.isLeaf()){
         return 0;
    }else{
        int maxDepth = 0;

        foreach(Node child : n.getChildren()){
            maxDepth = Math.max(maxDepth, getHeight(child));
        }

        return maxDepth + 1;
    }
}

答案 1 :(得分:0)

我这次聚会晚了4年零9个月,但是我认为上面的伪代码非常正确,但这是

if(n.isLeaf()){
     return 0;
}

应该是:

if(n.isLeaf()){
     return 1;
}

以下是该问题的有效解决方案:

public int dfsForMaxDepth(Node node) {

    if (node == null) {
        return 0;
    }

    if (node.children.size() == 0) {
        return 1;
    }

    int maxDepth = 0;

    for (int i = 0; i < node.children.size(); i++) {
        maxDepth = Math.max(maxDepth, dfsForMaxDepth(node.children.get(i)));
    }

    return maxDepth + 1;
}

基本案例1

如果根为零,则最大深度为0。

基本案例2

如果该节点没有子节点(是叶子),则该节点的高度仅为1。

递归案例

如果节点确实有子节点,我们将找到其所有子节点的最大深度,并将所有结果相互“竞争”,最后从所有子节点返回“获胜”最大深度,并对节点进行计数我们在。

可以删除基本情况2,因为如果节点没有子节点,则for循环将永远不会有任何“房间”运行,并且只会返回maxDepth + 1,但是由于maxDepth的搜索为0 ,0 + 1 = 1可以为您提供与逻辑相同的东西:

if (node.children.size() == 0) {
    return 1;
}

基本提示

由于我们尝试做太多事情,树的问题可能会令人困惑。我们会尝试存储递归应该为我们处理的额外状态,或者我们只是认为需要发生什么。

关键是让您让递归进行繁重的工作,只考虑“这里需要发生什么。在此节点上需要发生什么”。 (当然,在生产中,您经常将递归DFS转换为具有类似堆栈结构的迭代解决方案,因为您可能会受到系统内存的限制,但是递归解决方案更优雅,更容易在面试中看到)

这是两件事:

1。)此功能的目标是什么?真正了解您要使用的功能

2。)每个通话将填充到整个末尾以构成整个图片的小拼图块?

无论如何,希望能帮助未来的人们解决这个问题。