问题:
实现一个函数来检查二叉树是否平衡(即没有 两个节点的高度与根的差异超过1)。
解决方案:
int maxDepth(Node *root)
{
if(!root) return 0;
return 1 + max(maxDepth(root->left), maxDepth(root->right));
}
int minDepth(Node *root)
{
if(!root) return 0;
return 1 + min(minDepth(root->left), minDepth(root->right));
}
bool isBalanced(Node *root)
{
return maxDepth(root)-minDepth(root) <= 1;
}
有人能帮我理解这个解决方案背后的直觉吗?我正在努力“看到”树算法背后的递归。我知道maxDepth
和minDepth
应该分别在树中找到最大深度和最小深度的节点的高度,但我不明白递归是如何工作的。< / p>
更重要的是,我不太清楚自己如何能够提出这个解决方案。因此,非常感谢任何有关如何处理树问题的提示。
答案 0 :(得分:1)
理解的最佳方式是查看示例:
a
/ \
b c
/ \
d e
当您在根节点上调用maxDepth
时'a'以下代码将执行什么操作?
return 1 + max(maxDepth(root->left), maxDepth(root->right));
它将返回1
或maxDepth('b')
maxDepth('c')
+ 最大
maxDepth('b')
将返回1
,因为:
1 + max( maxDepth(NULL), maxDepth(NULL) ) = 1 + (max (0,0)) = 1 + 0 = 0;
以上从'b' - &gt;左和'b' - &gt;右
获取NULL
s
所以,回到maxDepth('a')现在我们知道它返回:
maxDepth('a') = 1 + max( 1, maxDepth('c'));
maxDepth('c')
将遵循相同的步骤并返回2.因此:
maxDepth('a') = 1 + max( 1, 2 ) = 1 + 2 = 3
对于 minDepth()流量是相同的,唯一的区别在于使用 min ()而不是 max ()。