当前位置: 首页 > 知识库问答 >
问题:

从子树的平衡证明树是平衡的

牛智志
2023-03-14

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

这本书的示例解决方案(复制如下)假设从节点发出的树是平衡的,如果(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);
}

共有3个答案

璩珂
2023-03-14

既然是你要求的,这里有更多关于归纳法的内容:

https://en.wikipedia.org/wiki/Well-founded_relation

忘记你所知道的关于归纳的一切,这里是真正的东西。如果我们有一些关系,R被认为是有根据的,当且仅当没有无限下降链x1,x2,x3,... x1 R x2,x2 R x3等等。(“下降”,因为人们在想

例如

有良好的关系,你有

(适用于所有x:(适用于所有y:x R y-

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

特例是你可能知道的归纳:

(P(0)

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

基本情况:(叶子,这些是微小的wrt子树关系)叶子有0个孩子是平衡的,微不足道

归纳:假设所有子树(和它们的子树等等)都是平衡的,根节点是平衡的,所有节点都是平衡的,没有剩下不平衡的节点(看到我在这里做了什么吗?)

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

娄嘉石
2023-03-14

平衡二叉树是指左右两个子树的总深度相差不超过一[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 depthright\u depth表示左/右子树相对于根节点的深度。

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

  • 阴波峻
    2023-03-14

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

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

     类似资料:
    • 如果是一棵平衡的树,我需要实现一个谓词,以便为真。 在这种情况下,二叉树由结构节点(左、右)定义,其中左和右可以是另一个节点或任何Prolog数据项。 我目前掌握的情况是: 预期产出: 它不起作用,任何建议将不胜感激!

    • 我正在解决LeetCode问题110。平衡二叉树: 给定一棵二叉树,确定它是否是高度平衡的。 对于这个问题,高度平衡的二叉树定义为: 一种二叉树,其中每个节点的左右子树的高度相差不超过1。 我已经看到了这个问题的解决方案,包括这个: 我的问题是:为什么要添加此代码? 当我从代码中删除它时,它看起来工作得很好。但是,当测试用例为< code>[1,2,2,3,null,null,3,4,null,n

    • 主要内容:二叉排序树转化为平衡二叉树,构建平衡二叉树的代码实现,总结上一节介绍如何使用二叉排序树实现动态 查找表,本节介绍另外一种实现方式—— 平衡二叉树。 平衡二叉树,又称为  AVL 树。实际上就是遵循以下两个特点的二叉树: 每棵子树中的左子树和右子树的深度差不能超过 1; 二叉树中每棵子树都要求是平衡二叉树; 其实就是在二叉树的基础上,若树中每棵子树都满足其左子树和右子树的深度差都不超过 1,则这棵二叉树就是平衡二叉树。 图 1 平衡与不平衡的二叉树及结点的

    • NowCoder 题目描述 平衡二叉树左右子树高度差不超过 1。 解题思路 // java private boolean isBalanced = true; public boolean IsBalanced_Solution(TreeNode root) { height(root); return isBalanced; } private int height(Tre

    • 排序二叉树中存在一个问题就是可能会退化成一个链表,当只有左子树或者右子树有节点的时候,此时排序二叉树就像链表一样,但因为排序二叉树在插入查询的时候还要判断左右子树的问题,这样查询的效率反而变低,从而引出了平衡二叉树 平衡二叉树又称平衡搜索树(Self-balance Binary Search Tree)又称AVL树,同时保证了查询和添加的效率。首先平衡二叉树是一颗排序二叉树,且它是空树或者他的每

    • 我试图理解二叉树的属性。但有一件事我不确定: 二叉树的dev.表示: > 如果任意两片树叶的深度差最大为1,则二叉树是平衡的。 我问我这两个定义是否相等,我的意思是定义。1统计Def。2和viceversa?...对我来说似乎是的...但是谁能用例子准确地解释我这个属性的(非)等价? 谢谢,帕特里克