Java 证明树是从子树';平衡性
我正在解决“破解编码面试”中的以下问题:实现一个函数来检查二叉树是否平衡。平衡树是这样一种树:任何节点的两个子树的高度相差不会超过一个 本书的示例解决方案(复制如下)假设从节点发出的树是平衡的,前提是(a)节点的左右子树是平衡的;(b)节点本身是平衡的。我想知道为什么会这样?上述两个条件的实现如何证明来自节点的整个树是平衡的 谢谢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)
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
-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你能解释一下,或者给我举一个归纳法用来证明平衡的例子吗?谢谢