【发布时间】:2013-12-03 17:22:24
【问题描述】:
找到二叉树的高度有很多;如何在 Java 中找到 n 叉树的高度?它会涉及遍历它并跟踪最大深度或类似的东西吗?
【问题讨论】:
-
如果你没有将树平衡成某种形状 - 唯一的变体是将一些最大深度存储在单独的变量中
找到二叉树的高度有很多;如何在 Java 中找到 n 叉树的高度?它会涉及遍历它并跟踪最大深度或类似的东西吗?
【问题讨论】:
实际上,对于 N 叉树,查找高度与查找任何其他类型的树没有什么不同。叶节点的高度为 0,非叶节点的高度比其最高的子节点高 1。
有一个递归函数,用伪代码在 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;
}
}
【讨论】:
我迟到了 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.) 每个调用将填充的小拼图是什么,以形成整个画面?
无论如何,希望能帮助未来的人解决这个问题。
【讨论】: