【发布时间】:2017-01-09 22:31:33
【问题描述】:
大家好,我想了解如何查看二叉树是否平衡。我试图打印出 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;
}
我的困惑在于以下代码行:
- 如果(根== NULL)返回0;
- 当它返回 0 时会发生什么,什么时候达到 0?是为了防止递归一直到未知的内存地址,还是返回数字0有什么意义?
-
如果(左>右)返回左+1;
- 为什么左边比右边大?当我查看它时,它总是返回右+1,因为条件永远不会为真,所以没有任何增量“左”?
-
int left = checkBalance(root->left);
- 以这种方式声明 int 是什么意思?这是让左>右的东西吗?
感谢您抽出宝贵时间阅读,我已经尝试自己研究这个问题,但我很难理解这段代码是如何工作的。
完整代码:http://pastebin.com/raw/VaiUNVdJ(案例6检查,案例1添加节点)
【问题讨论】:
-
您似乎对这个算法的工作方式有一些误解。有一些条件可以定义什么是平衡二叉树。这些是您在算法的每个步骤中检查的条件。你应该阅读this post
-
是的,我确实有一些误解,我明天会尝试再次阅读该帖子。我个人觉得递归有点难以理解有时真正发生的事情。但我会尽力研究链接,谢谢!
-
要理解递归,你应该练习一些基本的算法,并在 Visual Studio 等 IDE 中逐行运行它们。这样,您就可以看到每个递归调用在调用堆栈上的内存。随着时间的推移,你应该会变得更好。
标签: c++ recursion tree binary-tree