【发布时间】:2016-03-17 10:52:30
【问题描述】:
我正在尝试使用(不平衡的)BST 来实现 TreeSet。我还想为树中的所有节点维护一个有序的双向链表。
TreeSet<Integer> set = new TreeSet<>();
set.add(10);
set.add(5);
set.add(15);
set.add(12);
// The linked list would be 5 <-> 10 <-> 12 <-> 15
链表是在 2 个哨兵节点的帮助下维护的,一个头节点和一个尾节点。因此,要遍历链表,您将从头节点开始并检查其.next 属性。
class Node<T extends Comparable<? super T>> {
private Node<T> left, right,
prev, next;
}
我有一个像这样的递归add 方法;
boolean add(T data) {
int oldSize = getSize();
root = add(data, root, head, tail);
return getSize() != oldSize;
}
Node<T> add(T data, Node<T> n, Node<T> low, Node<T> high) {
if (n == nullNode) {
n = new Node<T>(data);
n.left = n.right = nullNode;
// But what do I do now to update the linked list?
} else {
int result = compare(data, n.data);
if (result < 0) {
n.left = add(data, n.left, low, n);
} else if (result > 0) {
n.right = add(data, n.right, n, high);
}
}
return n;
}
其中low 和high 设置了新节点在链表中的插入位置。
我在维护节点的 next 和 prev 属性时遇到问题。
【问题讨论】:
标签: tree linked-list binary-search-tree treeset