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

使用递归的二叉树平衡检查?

傅经业
2023-03-14

你们好,伙计们,我正在试图理解我如何看到二叉树是否平衡。我试图打印出cout语句,以便进一步理解它,但运气不好。

算法的想法是,如果它返回-1,它就不平衡,如果它返回其他任何东西,它是平衡的。

然而,我并没有真正理解这个算法是如何工作的。但是我想知道的一些事情是;

int checkBalance(node *root)
{
if (root == NULL) return 0;

int left = checkBalance(root->left);
int right = checkBalance(root->right);
 //cout << "Root: " << root->key << " Left: " << left << ", Right: " << right << endl;

if (left == -1 || right == -1) return -1;
if (abs(left-right) > 1) return -1;

if (left > right) return left+1;
return right+1;
}

我的困惑点在于以下代码行:

  • 如果 (根 == 空) 返回 0;
    • 当它返回 0 时会发生什么,何时达到 0?它只是为了防止递归继续转到未知的内存地址,还是返回数字0有任何意义?

    如果(左

    • 左边怎么比右边大?当我查看它时,它总是返回right 1,因为没有任何东西会“left”递增,因为条件从不为真

    int 左 = 检查平衡(根-

    • 用这种方式声明int是什么意思?这是向左的东西吗

    感谢您抽出时间阅读,我已经尝试自己研究这个问题,但是我很难理解这段代码是如何工作的。

    完整代码:html" target="_blank">http://pastebin.com/raw/VaiUNVdJ(案例6检查,案例1添加节点)

共有1个答案

郜修雅
2023-03-14

这是基本的BBT检查。它检查子树是否平衡。如果不是,则返回-1;如果是,它返回深度。

在伪代码中:

    < li >如果给定的子树为空,则返回0(深度) < li >在左右子树上循环(检查平衡和深度) < li >如果任一子树不平衡,则返回-1 < li >比较左侧

要解决您的具体问题:

  1. 此算法返回树深度(如果不平衡,则返回-1)。空树的深度为0。
  2. 只要左树比右树深,左树就比右树大。你看到这个还有问题吗
  3. 这就是如何声明和初始化变量。它与left=0中的语法相同,只是赋值的RHS是一个表达式

这足以让你摆脱困境了吗?

让我们采用您给出的节点值,使用根部为 49、子级为 48 和 51 的树结构,中缀表示法可能如下所示:

(48, 49, (50, 51, 52))

以更严格的形式,

49->left  = 48
49->right = 51
51->left  = 50
51->right = 52
There are no other children

在开始时根 = 节点 49,我们得到

int left = checkBalance(root->left);    // returns depth of 1
int right = checkBalance(root->right);  // returns depth of 2

现在,向左

 类似资料:
  • 我有一个<code>BinarySearchTree</code>,里面有Instance bankaccount的对象,这是我创建的一个类,所以基本上它只是一个二进制搜索树,我编写了一个方法,它将获取树并对其进行平衡,因为某些原因,它在平衡之前准确地打印出树: 现在,首先我有方法,它接受一个列表和一个并通过按顺序检查树数据来创建树数据的,因此它是一个排序数组。然后使用另一种方法以平衡的方式创建树

  • 我工作的问题,以检查如果二进制结构树是平衡或不,当我运行代码,我得到EXC_BAD_ACCESS,我不确定如何修复问题,是什么导致它打破。 假设代码在某个时刻命中 NULL 并返回 (true,-1),并深入到左侧子树。然后返回并转到右侧子树。我们可以检查左和右的子树是否由不同的平衡,如果它是 谢谢

  • 我实现了下面的C代码,以检查二叉树是否平衡,即左右子树的高度相差最多1。但是,我不确定它是否有效,或者以错误的方式重复检查子树。有人能引导我吗?

  • 主要内容:二叉排序树转化为平衡二叉树,构建平衡二叉树的代码实现,总结上一节介绍如何使用二叉排序树实现动态 查找表,本节介绍另外一种实现方式—— 平衡二叉树。 平衡二叉树,又称为  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树,同时保证了查询和添加的效率。首先平衡二叉树是一颗排序二叉树,且它是空树或者他的每