【问题标题】:Balanced Binary Trees Depth平衡二叉树深度
【发布时间】:2013-07-14 03:21:43
【问题描述】:
当给定多个节点时,我们可以通过 log2(n) 计算二叉树的最小深度
其中 n 是节点数。
如果你画出树的最大深度,例如 12 个节点,你会发现如果树要保持平衡,最大深度只能是 4。
0
/ \
0 0
/ \ / \
0 0 0 0
/\ \ \
0 0 0 0
对于糟糕的 ascii 艺术感到抱歉。有谁知道在给定节点数时能够计算二叉树最大深度的论坛?或者至少为我指明正确的方向?
【问题讨论】:
标签:
binary-tree
max
min
depth
formulas
【解决方案1】:
通过使用根元素:
int maxHeight(BinaryTree *p) {
if (!p) return 0;
int left_height = maxHeight(p->left);
int right_height = maxHeight(p->right);
return (left_height > right_height) ? left_height + 1 : right_height + 1;
}
通过使用节点的数量和一些数学逻辑(我绝对无法正确表达(我绝不是数学大师);但就是这样):
观察:
- 2-3 个节点 => maxDepth = 1 (2 = 2^1, 3 = 2^1,..
- 4-7 个节点 => 最大深度 = 2 (4 = 2^2, 5 = 2^2,.., 6 = 2^2,.., 7 = 2^2,...
- 8-15 个节点 => 最大深度 = 3
- ...
分析:
- m => max Depth(实际深度的INT部分,舍去小数位)
n => 节点数
ln => 自然对数 (=log[e])
2^m = n
ln(2^m) = ln(n)
- m*ln(2) = ln(n)
- m = ln(n)/ln(2)
结论:
现在,如果 m = 2,... ,则最大深度为 2。只需获取其中的 int 部分即可。 ;-)
注意:我肯定是在重新发明轮子;但这可能是处理你一无所知的事情的乐趣的一部分;并按照你的直觉和观察去做...... :-)
【解决方案2】:
最简单的答案如下:
int getMaxDepth(Node node)
{
if(node == null) {
return 0;
}
int leftDepth = 1 + getMaxDepth(node.left);
int rightDepth = 1 + getMaxDepth(node.right);
return left > right ? left : right;
}
概念explained
【解决方案3】:
设节点数给定(n)=15
公式是- log2n (log n base 2)
现在取一个最大值,该最大值必须小于 15,并且必须是 2 的幂结果。
因为这里给出了 15,所以没有将是 8。
现在,n=8
log2(8)= 3,这是我们需要的答案