在查找二叉树是否平衡时难以理解递归

时间:2013-09-13 03:18:16

标签: algorithm recursion

int cntHeight(TreeNode *root) {
    if(root == NULL) return 0;
    int l = cntHeight(root->left);
    int r = cntHeight(root->right);
    if(l < 0 || r < 0 || abs(l-r) > 1) return -1;
    else  return max(l, r) + 1;
}

bool isBalanced(TreeNode *root) {
    return cntHeight(root) >= 0;
}

我在C中找到了这个解决方案来检查二叉树是否平衡。但是,我很难想象这个算法是如何完全工作的。出于这个原因,有两件事我不确定。

  1. 算法是否在树的中间递归,而不仅仅是两侧?
  2. 我注意到只调用了max(1, r),我们也不需要找到min吗?
  3. 此外,您如何开发这样的算法?我不知道如何提出这样的解决方案..

2 个答案:

答案 0 :(得分:3)

  1. 是的,它也会对树的中间进行处理。它会检查每个节点的左侧和右侧,这自然会包含中间节点。

  2. 你为什么需要分钟?你对最大深度=高度感兴趣。请注意,它是max(l, r)而非max(1, r)(愚蠢的Ls)

  3. 你从小开始开发它。想想一个由单个节点组成的树,应该返回什么?然后添加另一个图层。而另一个。您经常会发现一层的解决方案取决于前一层的解决方案。这就是递归的来源。然后你必须考虑如果函数调用自身会发生什么;什么时候会停止呼唤自己?这称为基本情况(在本例中为if(root == null))。如果它没有停止,您将获得堆栈溢出

答案 1 :(得分:1)

魔法发生在cntHeight函数中。它将树的一部分作为参数,如果该部分为空则返回0,如果不平衡则返回-1,否则返回其深度。

要做到这一点,它首先通过调用自身来获取其子树(左和右)的深度。如果其中一个子树不平衡,则整棵树不平衡,因此它立即返回-1。如果其中一个子树比另一个更深,那么树也是不平衡的,所以它返回-1(这是abs(l-r) > 1检查的内容)

在最后一行,该函数计算传递树的深度。这是根节点的深层子树(因此max)+ 1的深度。

我想说开发像这样的算法的主要因素是经验。你看到的算法越多,你对可用方法的感觉就越多。