欢迎光临散文网 会员登陆 & 注册

2023新版数据结构与算法Java视频教程(下篇),java高级程序员必学的数据

2023-08-18 19:21 作者:爱幻想的随心者  | 我要投稿

跟着写了几遍B树,发现balance方法里向右借key的代码好像有点小错误。

//2.2向右借用
if (right != null && right.keyNumber > MIN_KEY_NUMBER) {
    node.insertKey(parent.keys[index], node.keyNumber);
    parent.keys[index] = right.removeLeftmostKey();
    if (!right.leaf) {
        node.insertChild(right.removeLeftmostChild(), node.keyNumber + 1);
    }
    return;
}


这里node.keyNumber+1应该是越界了。

考虑到每次调用insertChild方法都是在insertKey之后,key已经++,此时keyNumber的值已经与孩子数目相等,所以插入索引应为keyNumber,猜测满老师可能是没有测试到这个情况。这里我给出一个测试用例,如有漏误欢迎指正

@Test
@DisplayName("case5: balance left rotate")
public void testRemove5_2() {
    /*
        4|5|6  ==>  5
                   / \
                  4   6
       5
      / \        ==>      5|7    ==>    5|7
     4   6|7|8           / | \         / | \
                        4  6  8      2|3|4  6 8

     3|5|7                     5                             5
    / | | \  ==>             /   \                        /     \
   2  4 6  8                3     7              ==>     3      7|9
                           / \   / \                    / \    / | \
                          2   4 6   8|9|10             2   4  6  8  10

     5                           7
    / \                        /   \
   _   7|9      ==>           5     9
   |   /|\                   / \   / \
  2|4 6 8 10                2|4 6 8  10
    */
    BTree tree = new BTree(2);
    tree.put(4);
    tree.put(5);
    tree.put(6);
    tree.put(7);
    tree.put(8);
    tree.put(3);
    tree.put(2);
    tree.put(9);
    tree.put(10);

    tree.remove(3);
    assertEquals("[7]", tree.root.toString());
    assertEquals("[5]", tree.root.children[0].toString());
    assertEquals("[9]", tree.root.children[1].toString());
    assertEquals("[2, 4]", tree.root.children[0].children[0].toString());
    assertEquals("[6]", tree.root.children[0].children[1].toString());
    assertEquals("[8]", tree.root.children[1].children[0].toString());
    assertEquals("[10]", tree.root.children[1].children[1].toString());
}


期待满老师继续产出高质量视频呀!(*^▽^*)



2023新版数据结构与算法Java视频教程(下篇),java高级程序员必学的数据的评论 (共 条)

分享到微博请遵守国家法律