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

跟着写了几遍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()); }
期待满老师继续产出高质量视频呀!(*^▽^*)