我想为1到20之间的数字绘制一个平衡的二叉搜索树。
_______10_______
/ \
___5___ 15
/ \ / \
3 8 13 18
/ \ / \ / \ / \
2 4 7 9 12 14 17 19
/ / / /
1 6 11 16
上面的树是否正确且平衡?
答案 0 :(得分:1)
在回答您的原始问题时,您是否需要先计算身高,不,您不需要。您只需要了解平衡树是最高和最短节点之间的高度差为零或一的树,实现此目的的最简单方法是确保在填充时始终选择可能列表的中点。子树中的顶级节点。
您的样本树是平衡的,因为所有叶节点都在底部或从下到底的水平,因此任何两个叶节点之间的高度差异最多为一个。
要创建数字1到20(包括1和20)的平衡树,您可以只设置根条目10或11(这些数字的中点为10.5),这样在任一子树中都有相同数量的数字。
然后只为每个子树递归执行。在10
的下方,5
是中点:
10
/ \
5 11-thru-19 sub-tree
/ \
1-thru-4 6-thru-9
sub-tree sub-tree
只需扩展一下,你就会得到类似的东西:
_______10_______
/ \
___5___ 15
/ \ / \
2 7 13 17
/ \ / \ / / \
1 3 6 8 11 16 18 <- depth of highest leaf node
\ \ \ \
4 9 12 19 <- depth of lowest leaf node
^
|
Difference is 1
中点可以在数字上方和下方的数量差异为1或0的数字处找到。对于包含1到20的数字的整个列表,有9个小于10,10个大于10(或者,如果您选择11作为中点,则数量为10和9)。
你的样本和我的样本之间的差异可能与我更喜欢通过在有选择的地方四舍五入来选择中点这一事实(意味着我的右子树往往“更重”)。因为你的左子树较重,所以你似乎已经四舍五入。
选择10作为初始中点后,左子树上没有余地,你必须选择5,因为它有4个上下。任何其他中点都会导致两半之间至少有两个差异(例如,选择4作为中点将具有三个和五个的两个半部分)。这仍然可以给你一个平衡的子树,具体取决于数据,但选择中点“更安全”。