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中找到了这个解决方案来检查二叉树是否平衡。但是,我很难想象这个算法是如何完全工作的。出于这个原因,有两件事我不确定。
max(1, r)
,我们也不需要找到min
吗?此外,您如何开发这样的算法?我不知道如何提出这样的解决方案..
答案 0 :(得分:3)
是的,它也会对树的中间进行处理。它会检查每个节点的左侧和右侧,这自然会包含中间节点。
你为什么需要分钟?你对最大深度=高度感兴趣。请注意,它是max(l, r)
而非max(1, r)
(愚蠢的Ls)
你从小开始开发它。想想一个由单个节点组成的树,应该返回什么?然后添加另一个图层。而另一个。您经常会发现一层的解决方案取决于前一层的解决方案。这就是递归的来源。然后你必须考虑如果函数调用自身会发生什么;什么时候会停止呼唤自己?这称为基本情况(在本例中为if(root == null)
)。如果它没有停止,您将获得堆栈溢出。
答案 1 :(得分:1)
魔法发生在cntHeight函数中。它将树的一部分作为参数,如果该部分为空则返回0,如果不平衡则返回-1,否则返回其深度。
要做到这一点,它首先通过调用自身来获取其子树(左和右)的深度。如果其中一个子树不平衡,则整棵树不平衡,因此它立即返回-1。如果其中一个子树比另一个更深,那么树也是不平衡的,所以它返回-1(这是abs(l-r) > 1
检查的内容)
在最后一行,该函数计算传递树的深度。这是根节点的深层子树(因此max
)+ 1的深度。
我想说开发像这样的算法的主要因素是经验。你看到的算法越多,你对可用方法的感觉就越多。