Pro*_*mer 36 java algorithm tree
请考虑以下代码:
public int heightOfBinaryTree(Node node)
{
if (node == null)
{
return 0;
}
else
{
return 1 +
Math.max(heightOfBinaryTree(node.left),
heightOfBinaryTree(node.right));
}
}
Run Code Online (Sandbox Code Playgroud)
我想知道这段代码背后的逻辑推理.人们是怎么想出来的?有些人有归纳证明吗?
此外,我想到只用二叉树的根作为参数获取二叉树的高度.以前的方法比我的好吗?为什么?
mar*_*cog 48
if (node == null)
{
return 0;
}
Run Code Online (Sandbox Code Playgroud)
叶节点的子节点是null
.因此,这就是说,一旦我们走过树叶,就没有其他节点了.
如果我们没有超过叶节点,我们必须计算高度,这个代码递归.
return 1 +
Run Code Online (Sandbox Code Playgroud)
当前节点将高度1添加到当前正在计算的子树的高度.
Math.max(heightOfBinaryTree(node.left),
heightOfBinaryTree(node.right));
Run Code Online (Sandbox Code Playgroud)
我们递归地计算左子树(node.left
)和右子树(node.right
)的高度.由于我们正在计算最大深度,因此我们取这两个深度的最大值.
我已经在上面说明了递归函数是正确的.因此,在父节点上调用该函数将计算整个树的深度.
这是本文档中树高的图形表示.h
是树的高度,hl
和hr
分别是左,右子树的高度.
此外,我想到只用二叉树的根作为参数获取二叉树的高度.以前的方法比我的好吗?为什么?
您提供的代码是DFS的一种形式.由于您必须处理所有节点以查找树的高度,因此DFS和BFS之间不存在运行时差异,尽管BFS将使用O(N)内存而DFS将使用O(logN)内存.BFS的代码也稍微复杂一些,因为它需要一个队列,而DFS则使用"内置"递归堆栈.