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

Binary Tree Balanced Check Using recursion?

大家好, 我正在尝试了解如何查看二叉树是否平衡。我试图打印出 cout 语句以尝试进一步理解它,但没有运气。

算法的思路是,如果returns -1 则不平衡,如果returns 其他则平衡。

但是我不太明白这个算法到底是如何工作的。 但我想知道的几件事是;

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;
}

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

  1. if (root == NULL) return 0;
    • 当它 return 为 0 时会发生什么,它什么时候达到 0?只是为了防止递归继续访问未知的内存地址,还是 return 数字 0 有任何意义?
  2. if(左>右)return左+1;

    • 左边怎么比右边大?在我查看它时,它总是 returns right+1,导致没有任何增量 'left' 因为条件永远不会为真?
  3. int left = checkBalance(root->left);

    • 当您以这种方式声明一个 int 时,这意味着什么?这就是让左 > 右的东西吗?

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

完整代码:http://pastebin.com/raw/VaiUNVdJ(检查案例 6,添加节点的案例 1)

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

在伪代码中:

  • 如果给定的子树为空,return 0(深度)
  • 在左右子树上递归(检查平衡和深度)
  • 如果任一子树不平衡,return -1
  • 比较左右深度;如果它们相差超过 1,return -1
  • 如果我们到了这里,这棵子树是平衡的。 Return 它的深度。这是两个子树深度中较大的一个,再加上 1。

解决您的具体问题:

  1. 此算法 return 树的深度(如果不平衡则为 -1)。空树的深度为 0.
  2. 只要左边的树比右边的树深,左边就比右边大。看到这里还有问题吗?
  3. 这就是您声明和初始化变量的方式。它与 in 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

以 root = node 49 开头,我们得到

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

现在,left < right,所以最后比较returns right+1, or 3, 也就是正确的树深度。