平衡的二进制搜索树对于保证O(log n)查找(或类似操作)至关重要。在动态环境中,随机地插入和/或删除了许多密钥,树可能会退化为链接列表,这对于查找来说是可怕的。因此,存在多种抵消这种效果的自平衡二叉树(例如AVL树或八叉树)。这些树是基于不同种类的旋转来重新平衡树的。
轮换
在此挑战中,我们将仅关注单个右旋,这样的旋转(左旋将是对称的)如下所示:
5 3
/ \ / \
3 6 => 1 5
/ \ / \
1 4 4 6
如果有任何叶子1
,4
或者6
有左子树或右子树,则旋转只需将它们保留在那里。如果这是较大树的子树,则只需在节点处“将其切除”,5
然后将旋转后的树(现在为node 3
)“重新连接” 到该节点。
挑战
给定二分搜索树1和关键字,如上所述,该树在该节点上向右旋转。上例中提供的密钥为5
。
规则和I / O
- 您可以使用任何类型的键,只要您选择的键与测试用例的键之间存在双射
- 您可以选择二叉树的任何表示形式,只要没有歧义(例如,
[3,[]]
除非另有说明,否则是模棱两可的),这对于您选择的语言是很自然的 - 由于输入将始终是二叉搜索树,因此没有重复的键
- 您可以假设密钥包含在树中
- 您可以假定包含密钥的节点有一个左子节点
- 您可能无法在提供的键下假设正确的子树
- 您可能不认为旋转之前树是不平衡的
- 您可能不认为旋转后树是平衡的
- 您可以使用任何默认的I / O方法
- 您提交的内容可能是返回树的功能或打印解决方案的完整程序
测试用例
这些示例表示一棵树,如下所示
- 如果是一片叶子:
[]
- 如果它是带有键的树
x
并且两个子树都是叶子:[x]
- 如果它是带有键
x
和子树的树left
right
:[x,left,right]
第一个示例是“ 旋转 ”部分中提供的示例。如果出于某种原因您需要它们的图形表示,请在此处2。
5 [5,[3,[1],[4]],[6]] -> [3,[1],[5,[4],[6]]]
5 [5,[3,[1],[4]],[]] -> [3,[1],[5,[4],[]]]
5 [5,[3,[],[4]],[6]] -> [3,[],[5,[4],[6]]]
5 [5,[3,[1],[]],[]] -> [3,[1],[5]]
4 [8,[4,[2,[1],[3]],[6,[5],[7]]],[12,[10,[9],[11]],[14,[13],[15]]]] -> [8,[2,[1],[4,[3],[6,[5],[7]]]],[12,[10,[9],[11]],[14,[13],[15]]]]
8 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [10,[6,[4,[2,[],[3]],[5]],[8,[7],[9]]],[11]]
10 [10,[8,[6,[4,[2,[],[3]],[5]],[7]],[9]],[11]] -> [8,[6,[4,[2,[],[3]],[5]],[7]],[10,[9],[11]]]
9 [6,[3,[2],[5]],[9,[8],[12,[11],[15,[14],[]]]]] -> [6,[3,[2],[5]],[8,[],[9,[],[12,[11],[15,[14],[]]]]]]
7 [7,[5,[3,[1],[4]],[6]],[8]] -> [5,[3,[1],[4]],[7,[6],[8]]]
15 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[13,[11,[10],[12]],[15,[14],[16]]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
21 [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[21,[19,[18],[20]],[24,[22],[25]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]] -> [17,[9,[5,[2,[0],[4]],[8]],[15,[13,[11,[10],[12]],[14]],[16]]],[40,[27,[19,[18],[21,[20],[24,[22],[25]]]],[28]],[44,[42,[41],[]],[51,[47],[59,[55],[61]]]]]]
1:对于任何节点,左子树中的所有键都小于该键,而右子树中的所有键都大于该键
2:为防止链接腐烂,我将它们嵌入作为注释
data B=B[B]Int
将节省更多的字节。