代码地址,包含代码和测试用例:https://github.com/rainzhao/datastruct/blob/master/src/main/java/example/tree/AVLTree.java
bobo老师您好,我在avl树的代码时发现如下问题:
测试用例如下:
AVLTree<Integer, String> avlTree = new AVLTree<>();
// 根节点
avlTree.add(20, "Y");
// 左子树
avlTree.add(18, "X");
avlTree.add(30, "X4");
avlTree.add(16, "Z");
avlTree.add(19, "X3");
avlTree.add(15, "X1");
avlTree.add(17, "X2");
// 右子树
avlTree.add(28, "Q3");
avlTree.add(34, "A");
avlTree.add(32, "Q1");
avlTree.add(36, "Q2");
期望结果如下:
18
* / \
* 16 30
* / \ / \
* 15 17 20 34
* / \ /
* 19 28 32
但是实际调试时发现如下问题:
* 添加32节点前:
* 18
* / \
* 16 20
* / \ / \
* 15 17 19 30
* / \
* 28 34
这时如果添加节点32,代码在20这个节点时满足了右旋转的条件,其实是应该左旋转而不是右旋转。最终导致程序不能输出最终期望的结果。
请您帮忙看下,代码我对了几遍和您的没有什么差别…,
发现只要把LL和RR的判断条件getBalanceFactor(node.right) > 0 和 getBalanceFactor(node.left)< 0 就没有问题。