在二叉搜索树的基础上加了每次访问的节点都会变为根节点
伸展树 JAVA 实现
1、节点定义
private static class SplayTreeNode<T extends Comparable<T>> {
private T element;
private SplayTreeNode<T> leftNode;
private SplayTreeNode<T> rightNode;
public SplayTreeNode(T element, SplayTreeNode<T> leftNode, SplayTreeNode<T> rightNode) {
this.element = element;
this.leftNode = leftNode;
this.rightNode = rightNode;
}
public SplayTreeNode(T element) {
this(element, null, null);
}
}
2、树的定义
public class SplayTree<T extends Comparable<T>> {
private SplayTreeNode<T> rootNode; // 根节点
}
3、插入节点
public void insert(T element) {
if (element == null) {
return;
}
rootNode = insert(element, rootNode);
}
private SplayTreeNode<T> insert(T element, SplayTreeNode<T> node) {
if (node == null) {
node = new SplayTreeNode<T>(element);
}
int compareResult = element.compareTo(node.element);
if (compareResult < 0) {
node.leftNode = insert(element, node.leftNode);
} else if (compareResult > 0) {
node.rightNode = insert(element, node.rightNode);
}
return node;
}
4、搜索
public T search(T element) {
if (element == null) {
return null;
}
rootNode = splay(element, rootNode);
return rootNode.element;
}
/*
* 旋转key对应的节点为根节点,并返回根节点。
* 自低向上旋转
*/
private SplayTreeNode<T> splay(T element, SplayTreeNode<T> node) {
if (node == null) {
return null;
}
SplayTreeNode<T> left = null;
SplayTreeNode<T> right = null;
int compareResult = element.compareTo(node.element);
if (compareResult < 0) {
right = node;
if (node.leftNode != null) {
node = splay(element, node.leftNode);
}
right.leftNode = node.rightNode;
node.rightNode = right;
} else if (compareResult > 0) {
left = node;
if (node.rightNode != null) {
node = splay(element, node.rightNode);
}
left.rightNode = node.leftNode;
node.leftNode = left;
} else {
}
return node;
}