【问题标题】:BST with a linked list between nodesBST 与节点之间的链表
【发布时间】: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;
}

其中lowhigh 设置了新节点在链表中的插入位置。

我在维护节点的 nextprev 属性时遇到问题。

【问题讨论】:

    标签: tree linked-list binary-search-tree treeset


    【解决方案1】:

    您必须跟踪前一个节点。即之前访问过的节点。

    这是通过查找有序前驱来完成的。有序前驱是节点左子树的最右边的叶子。

    同样的,你必须找到设置下一个节点的中序后继。

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

    在线查看有序的前任和后继概念。

    注意:这不是最有效的方法,但应该是入门的好方法。

    【讨论】:

      猜你喜欢
      • 2020-01-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-23
      • 2022-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多