我正在解决“破解编码面试”中的以下问题:实现一个函数来检查二叉树是否平衡。平衡树是这样一种树:任何节点的两个子树的高度相差不会超过一个。
这本书的示例解决方案(复制如下)假设从节点发出的树是平衡的,如果(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);
}
既然是你要求的,这里有更多关于归纳法的内容:
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个孩子是平衡的,微不足道
归纳:假设所有子树(和它们的子树等等)都是平衡的,根节点是平衡的,所有节点都是平衡的,没有剩下不平衡的节点(看到我在这里做了什么吗?)
如果我们还注意到平衡意味着子树是平衡的,我们可以在不使用传递闭包的情况下做到这一点。然后我们可以说,使直接子树平衡意味着它们的所有子树也平衡,我们回到了我的证明。
平衡二叉树是指左右两个子树的总深度相差不超过一[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
表示左/右子树相对于根节点的深度。
这里可以找到之前提出的一个问题,该问题涵盖了BST编码的几个非常有趣的方面。
这是递归的一个应用程序–例程计算被检查节点的左子树和右子树的高度,同时递归验证子树。如果发现任何节点不平衡或子树高度正常,则返回-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?...对我来说似乎是的...但是谁能用例子准确地解释我这个属性的(非)等价? 谢谢,帕特里克