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

时间:2016-09-01 22:17:00

标签: c++ recursion tree binary-tree

大家好,我试图了解如何看待二叉树是否平衡。我试图打印出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;
}

我的困惑之处在于以下几行代码:

  1. if(root == NULL)返回0;
    • 当它返回0时会发生什么,何时达到0?是否只是为了防止递归继续到未知的内存地址,或者返回数字0是否有任何意义?
  2. if(left> gt; right)返回左+ 1;

    • 如何让自己变得更大?当我查看它时,它总是返回正确+ 1,导致没有任何增量&#39; left&#39;既然情况永远不成真呢?
  3. int left = checkBalance(root-&gt; left);

    • 当你以这种方式声明一个int时,这意味着什么?这是左边的东西&gt;正确?
  4. 感谢您花时间阅读,我尝试自己研究这个问题,但我很难理解这段代码是如何工作的。

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

1 个答案:

答案 0 :(得分:-1)

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

在伪代码中:

  • 如果给定的子树为空,则返回0(深度)
  • 重复左右子树(检查余额和深度)
  • 如果任一子树不平衡,则返回-1
  • 比较左边和左边的正确的深度;如果它们相差超过1,则返回-1
  • 如果我们到了这里,这个子树是平衡的。回归深度。这是两个子树深度中较大的一个,加上1。

解决您的具体问题:

  1. 此算法返回树深度(如果不平衡,则返回-1)。空树的深度为0。
  2. 左侧树比右侧更深,左侧大于右侧。你还有问题要看吗?
  3. 这是您声明和初始化变量的方式。它的语法与left = 0 中的相同,只是赋值的RHS是表达式。
  4. 这是否足以让你解开?

    让我们使用你给出的节点值,使用树根结构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
    

    现在,左&lt;正确,因此最终比较返回右+ 1或3,这是正确的树深度。