Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tree 节点之间具有链表的BST_Tree_Linked List_Binary Search Tree_Treeset - Fatal编程技术网

Tree 节点之间具有链表的BST

Tree 节点之间具有链表的BST,tree,linked-list,binary-search-tree,treeset,Tree,Linked List,Binary Search Tree,Treeset,我正在尝试使用(不平衡的)BST实现树集。我还希望为树中的所有节点维护一个有序的双链接列表 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 我有一个递归的add方法,就像这样 boolean add(T

我正在尝试使用(不平衡的)BST实现树集。我还希望为树中的所有节点维护一个有序的双链接列表

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
我有一个递归的
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;
}
boolean添加(T数据){
int oldSize=getSize();
根=添加(数据、根、头、尾);
返回getSize()!=oldSize;
}
节点添加(T数据、节点n、节点低、节点高){
if(n==nullNode){
n=新节点(数据);
n、 左=n。右=空节点;
//但是我现在要做什么来更新链表呢?
}否则{
int结果=比较(数据,n.数据);
如果(结果<0){
n、 左=添加(数据,n.左,低,n);
}否则,如果(结果>0){
n、 右=添加(数据,n.右,n.高);
}
}
返回n;
}
其中
low
high
设置链接列表中插入新节点的位置的边界


我在维护节点的
next
prev
属性时遇到问题

您必须跟踪上一个节点。i、 e.以前访问过的节点

这是通过查找索引前置项来完成的。Inorder Preference是节点左子树的最右叶

同样,您必须找到顺序更高的后续节点来设置下一个节点

当然,这里也有例外——如果节点是叶呢? 在这种情况下,inorder PRESIONER将是第一个祖先,其右子树将包含当前节点。类似地,用于查找下一个节点

在线查看inorder的前身和后续概念

注意:这不是最有效的方法,但应该是一个很好的开始方法

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;
}