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

leetcode 110。平衡二叉树,平衡树代码的问题

计寒
2023-03-14

我正在解决LeetCode问题110。平衡二叉树:

给定一棵二叉树,确定它是否是高度平衡的。

对于这个问题,高度平衡的二叉树定义为:

一种二叉树,其中每个节点的左右子树的高度相差不超过1。

我已经看到了这个问题的解决方案,包括这个:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     struct TreeNode *left;
 *     struct TreeNode *right;
 * };
 */
int max(int a, int b){
    return (a > b) ? a:b;
}
int height(struct TreeNode* root){
    if(root == NULL) return 0;
    return 1 + max(height(root->left),height(root->right));
}
bool isBalanced(struct TreeNode* root){
    if(root == NULL) return 1;
    int left = height(root->left);
    int right = height(root->right);
    
    return abs(left - right) <= 1 && isBalanced(root->left) && isBalanced(root->right);
}

我的问题是:为什么要添加此代码?

isBalanced(root->left) && isBalanced(root->right);

当我从代码中删除它时,它看起来工作得很好。但是,当测试用例为< code>[1,2,2,3,null,null,3,4,null,null,4]时,代码将返回true,而预期答案为false。

我对这个测试充满了疑问,因为测试树的两端都是一样的深度,所以abs(左右)应该是0,而0

共有2个答案

龚同
2023-03-14

一种二叉树,其中每个节点的左右子树的高度相差不超过1。

在这里,您已经提到了为什么您的实现会引发错误。您的代码仅检查根节点(最顶层节点)的高度平衡。

平衡树中每个节点的高度差一定是[-1,0,1]。更简单的可视化是考虑每个节点本身有一棵小树。

假设这是测试用例< code>[1,2,2,3,null,null,3,4,null,null,4]。

       1
      / \
     2   2
    /     \
   3       3
  /         \
 4           4

如果只检查根节点,则< code>abs(left-right)为0。但是考虑左边的节点2。把它想象成一棵更小的树或子树。

     2  
    /    
   3      
  /         
 4        

如果这是一棵树本身,那么它就不平衡,因为abs(左-右)== 2。由于我们发现了一个不平衡的节点,因此返回 false

因此,为了解决这个问题,我们必须将每个节点视为一个单独的树本身。此类问题需要递归算法,通过递归调用它们的子节点,从最高节点到最低节点检查isBal的属性。

曾典
2023-03-14

测试用例是< code>[1,2,2,3,null,null,3,4,null,null,4],

因此,让我们可视化该树:

            1
           / \
          2   2
         /     \
        3       3
       /         \
      4           4 

代码将返回 true,而预期的答案是假的,

预期的答案是false:上面的树不是平衡树。

我对这个测试充满了疑问,因为测试树的两端都是一样的深度,所以abs(左右)应该是0,而0

您说得对,abs(left-right)是0,并且在界限[-1,1]内,但是在平衡树中,这个条件在每个节点中都必须为真。因此,您的代码还必须检查< code>abs(left-right)是否在其他节点的限制范围内。然后您可以看到值为2的第一个节点有一个左子树,比它的右子树(为空)高2级。所以我们违反了规则,正确答案是< code>false。

这解释了为什么您真的需要这两个对< code>isBalanced的递归调用。

 类似资料:
  • 主要内容:二叉排序树转化为平衡二叉树,构建平衡二叉树的代码实现,总结上一节介绍如何使用二叉排序树实现动态 查找表,本节介绍另外一种实现方式—— 平衡二叉树。 平衡二叉树,又称为  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?...对我来说似乎是的...但是谁能用例子准确地解释我这个属性的(非)等价? 谢谢,帕特里克

  • 在上一节中,我们考虑构建一个二叉搜索树。正如我们所学到的,二叉搜索树的性能可以降级到 $$O(n)$$ 的操作,如 get 和 put ,如果树变得不平衡。在本节中,我们将讨论一种特殊类型的二叉搜索树,它自动确保树始终保持平衡。这棵树被称为 AVL树,以其发明人命名:G.M. Adelson-Velskii 和E.M.Landis。 AVL树实现 Map 抽象数据类型就像一个常规的二叉搜索树,唯一

  • 在我们继续之前,我们来看看执行这个新的平衡因子要求的结果。我们的主张是,通过确保树总是具有 -1,0或1 的平衡因子,我们可以获得更好的操作性能的关键操作。 让我们开始思考这种平衡条件如何改变最坏情况的树。有两种可能性,一个左重树和一个右重树。 如果我们考虑高度0,1,2和3的树,Figure 2 展示了在新规则下可能的最不平衡的左重树。 Figure 2 看树中节点的总数,我们看到对于高度为0的