我正在解决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
一种二叉树,其中每个节点的左右子树的高度相差不超过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的
属性。
测试用例是< 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的