我跟着老师说的话似乎有效,但这里看起来很奇怪......
首先,这是应该将新元素插入AVL树的类。
public class AVLTree<T> {
private AVLTreeNode<T> root;
public void insert(TreeElem<T> data) {
if(root == null)
root = new AVLTreeNode<>(data, 0, null, null);
else
insert(root, data, 0);
}
private void insert(AVLTreeNode<T> root, TreeElem<T> x, int height) {
// root.setHeight(Math.max(root.getRight().getHeight(), root.getLeft().getHeight()) + 1);
if(x.lessThan(root.getElem())) {
if(root.getLeft() == null) {
root.setLeft(new AVLTreeNode<>(x, height, null, null));
if(Math.abs(root.getLeft().getHeight() - (root.getRight() == null ? 0 : root.getRight().getHeight())) == 2)
if(x.lessThan(root.getLeft().getElem()))
rotateLeft(root);
else
doubleLeftRotate(root);
} else
insert(root.getLeft(), x, height + 1);
} else if(x.greaterThan(root.getElem())) {
if(root.getRight() == null) {
root.setRight(new AVLTreeNode<>(x, height, null, null));
if(Math.abs((root.getLeft() == null ? 0 : root.getLeft().getHeight()) - root.getRight().getHeight()) == 2)
if(x.lessThan(root.getLeft().getElem()))
rotateRight(root);
else
doubleRightRotate(root);
} else
insert(root.getRight(), x, height + 1);
}
System.out.println((root.getRight() == null ? 0 : root.getRight().getHeight()) - (root.getLeft() == null ? 0 : root.getLeft().getHeight()));
}
public void print() {
print(root);
}
private void print(AVLTreeNode<T> root) {
if(root == null) return;
System.out.println(root.getElem().toString());
print(root.getLeft());
print(root.getRight());
}
/***************************************
************ ROTATIONS ****************
***************************************/
private void rotateLeft(AVLTreeNode<T> node) {
// Swap node with node.left
AVLTreeNode<T> temp = node, right = temp.getRight();
//
node.setElem(right.getElem());
node.setHeight(right.getHeight());
node.setLeft(right.getLeft());
node.setRight(right.getRight());
// set root
right.setElem(temp.getElem());
right.setHeight(temp.getHeight());
right.setRight(temp.getRight());
right.setLeft(temp.getLeft());
//
node.setLeft(node.getRight());
node.setRight(null);
}
private void rotateRight(AVLTreeNode<T> node) {
// Swap node with node.left
AVLTreeNode<T> temp = node, left = temp.getLeft();
//
node.setElem(left.getElem());
node.setHeight(left.getHeight());
node.setLeft(left.getLeft());
node.setRight(left.getRight());
// set root
left.setElem(temp.getElem());
left.setHeight(temp.getHeight());
left.setRight(temp.getRight());
left.setLeft(temp.getLeft());
//
node.setRight(node.getLeft());
node.setLeft(null);
}
private void doubleLeftRotate(AVLTreeNode<T> node) {
rotateRight(node.getRight());
rotateLeft(node);
}
private void doubleRightRotate(AVLTreeNode<T> node) {
rotateLeft(node.getLeft());
rotateRight(node);
}
}
根据我的测试课,似乎有效。
但我在这里无法理解:
目前:
if(x.lessThan(root.getLeft().getElem()))
rotateLeft(root);
else
doubleLeftRotate(root);
我应该检查x是否小于root.getLeft,
如果我将左侧指定为x?
TreeElem是一个类似的界面。
但重点是:
我的插入方法好不好?