Java 证明树是从子树';平衡性

Java 证明树是从子树';平衡性,java,tree,binary-tree,tree-balancing,Java,Tree,Binary Tree,Tree Balancing,我正在解决“破解编码面试”中的以下问题:实现一个函数来检查二叉树是否平衡。平衡树是这样一种树:任何节点的两个子树的高度相差不会超过一个 本书的示例解决方案(复制如下)假设从节点发出的树是平衡的,前提是(a)节点的左右子树是平衡的;(b)节点本身是平衡的。我想知道为什么会这样?上述两个条件的实现如何证明来自节点的整个树是平衡的 谢谢 public static boolean isBalanced(TreeNode root) { if (checkHeight(root)==-1)

我正在解决“破解编码面试”中的以下问题:实现一个函数来检查二叉树是否平衡。平衡树是这样一种树:任何节点的两个子树的高度相差不会超过一个

本书的示例解决方案(复制如下)假设从节点发出的树是平衡的,前提是(a)节点的左右子树是平衡的;(b)节点本身是平衡的。我想知道为什么会这样?上述两个条件的实现如何证明来自节点的整个树是平衡的

谢谢

public static boolean isBalanced(TreeNode root)
{
    if (checkHeight(root)==-1)
        return false;
    return true;
}


public static int checkHeight(TreeNode root)
{
    //base case
    if (root == null)
        return 0;

    //is left subtree balanced
    int leftHeight = checkHeight(root.leftChild);

    if (leftHeight == -1)
        return -1;

    //is right subtree balanced
    int rightHeight = checkHeight(root.rightChild);

    if (rightHeight == -1)
        return -1;

    //is current node balanced
    int heightDiff = leftHeight - rightHeight;

    if (Math.abs(heightDiff) > 1)
        return -1;

    return (Math.max(leftHeight, rightHeight) + 1);
}

平衡二叉树是指左右两个子树的总深度相差不超过1的树。这里,给出的解决方案是递归的,首先检查子对象本身是否平衡,然后检查父对象是否平衡。它通过检查子对象的左、右子树的深度来实现这一点,如果它们之间的深度相差atmost 1,则返回
max(left\u depth,right\u depth)+1
。如果不是,则返回
-1
。然后,该算法对整个树继续执行此操作。如果深度在任意点为-1(表示子树未平衡),则子树的总体深度将返回为-1。最后,只需检查树的总深度是否为-1:如果为-1,则树不平衡,否则为-1

以下是归纳法形式的算法:

  • 基本情况

    叶节点-平凡平衡,具有0个子节点。它返回1,因为 深度将包括子对象数(0)和子对象数 节点本身

  • 归纳案例

    中间节点,如果子节点是 平衡,左侧子对象的深度与右侧子对象的深度相差atmost 1。 如果平衡,它返回
    max(left\u depth,right\u depth)+1
    ,表示树的总深度, 包括节点本身。如果不平衡,只需返回
    -1

  • 最后

    根节点,与感应情况一样进行检查,但如果平衡,则 整个树是平衡的,总深度为
    max(left\u depth,right\u depth)+1
    ,其中
    left\u depth
    right\u depth
    表示左/右子树相对于根节点的深度

可以找到之前提出的一个SO问题,该问题涵盖了BST编码的几个非常有趣的方面。

这是递归的一个应用程序–例程计算被检查节点的左、右子树的高度,同时递归验证子树。如果发现任何节点不平衡或子树高度正常,则返回
-1
。子树高度的比较决定当前节点是否平衡


顺便说一句,在整个
checkHeight()
函数中将
root
替换为
currnode
,以明确例程如何递归地应用于树中的每个节点,而不仅仅是它的根。

既然您要求它,这里有一些关于归纳的更多信息:

忘记你所知道的关于归纳法的一切,这里是真实的东西。如果我们有一些关系R,R被认为是有充分根据的当且仅当不存在无限下降链x1,x2,x3。。。使用x1 R x2、x2 R x3等。(“下降”是因为人们在思考<关于数字的问题)

例如,<基于自然数,而不是实数

有着良好的关系,你就有了

(对于所有x:(对于所有y:x RY->p(y))->p(x))对于所有x:p(x)

换句话说,它足以表明所有最小元素都是wrt。R有一些性质,然后证明如果所有比x小的元素都满足P,那么x也满足P

特殊情况是您可能知道的归纳法:

(p(0)&对于所有n:p(n)->p(n+1))->对于所有n:p(n)(这里有充分的基础的关系是后继函数)

对于有限树,子树关系(显然)是有充分基础的,因此我们可以(实际上让我们使用传递闭包,使证明更短。它仍然是有充分基础的):

基本情况:(叶,这些是最小wrt子树关系) 子级为0的叶是平衡的,非常简单

归纳法: 假设所有子树(以及它们的子树等等)都是平衡的,并且根节点是平衡的,所有节点都是平衡的,没有可能不平衡的节点(参见我在这里所做的吗?)


如果我们也注意到平衡意味着子树是平衡的,那么我们可以在不使用传递闭包的情况下实现这一点。那么我们可以说,让直接子树保持平衡意味着它们的所有子树也保持平衡,我们回到了我的证明。

谢谢,有抱负的中士。你能解释一下你的答案中说中间节点是平衡的,如果“子节点是平衡的,左边子节点的深度等于右边子节点的深度”,有证据证明吗?@randomUser47534:对不起。我回答错了。如果子对象是平衡的,则左侧子对象的深度不等于右侧子对象的深度,但与右侧子对象的深度相差最多1。这源于BST平衡的定义方式——根据我引用的链接[1],平衡BST是指左右节点的高度差不超过1的BST,因此这源于定义。然后简单地在树上递归,从叶子开始,以确保这个定义在每一点上都成立。第一句混淆了重量平衡和高度平衡。OP和你的回答谈到了身高平衡,但你的第一句定义了体重平衡。为什么没有人说归纳法?@kutschkem你能解释一下,或者给我举一个归纳法用来证明平衡的例子吗?谢谢