Java 这是一个有效的AVL树插入函数吗?
我按照老师说的做了,似乎奏效了,但这里有些东西看起来很奇怪 首先,这个类应该向AVL树插入一个新元素Java 这是一个有效的AVL树插入函数吗?,java,binary-search-tree,avl-tree,Java,Binary Search Tree,Avl Tree,我按照老师说的做了,似乎奏效了,但这里有些东西看起来很奇怪 首先,这个类应该向AVL树插入一个新元素 public class AVLTree<T> { private AVLTreeNode<T> root; public void insert(TreeElem<T> data) { if(root == null) root = new AVLTreeNode<>(data, 0,
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);
}
}
我应该检查x是否小于root.getLeft
如果我给左边指定了x
TreeElem是一个可比较的接口
但要点是:
我的插入方法好还是不好?你说的“好”是什么意思?如果你已经尝试过了,并且你得到了你期望的结果,我会说它很好。如果你想彻底检查你的代码,你应该重新发布它。@ChrisHayes我在问你是否能看到任何问题输出有问题吗?一个特定的测试用例是否不起作用?StackOverflow的设计目的是帮助诊断和解决观察到的问题,而不是在“案例”中检查代码。我绝对建议把这个移到。
if(x.lessThan(root.getLeft().getElem()))
rotateLeft(root);
else
doubleLeftRotate(root);