理解树递归的直观方法 - 编写代码以检查二叉树是否平衡

时间:2014-12-22 20:55:29

标签: algorithm recursion tree

问题:

  

实现一个函数来检查二叉树是否平衡(即没有   两个节点的高度与根的差异超过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;
}

有人能帮我理解这个解决方案背后的直觉吗?我正在努力“看到”树算法背后的递归。我知道maxDepthminDepth应该分别在树中找到最大深度和最小深度的节点的高度,但我不明白递归是如何工作的。< / p>

更重要的是,我不太清楚自己如何能够提出这个解决方案。因此,非常感谢任何有关如何处理树问题的提示。

1 个答案:

答案 0 :(得分:1)

理解的最佳方式是查看示例:

   a
  / \
 b   c
    / \
   d   e

当您在根节点上调用maxDepth时'a'以下代码将执行什么操作?

return 1 + max(maxDepth(root->left), maxDepth(root->right));

它将返回1maxDepth('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 ()。