当前位置: 首页 > 知识库问答 >
问题:

节点之间具有链表的BST

顾琛
2023-03-14

我正在尝试使用(不平衡的)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

链表是在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属性时遇到了问题。

共有1个答案

汝天宇
2023-03-14

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

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

同样,您必须找到设置下一个节点的顺序继承者。

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

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

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

 类似资料:
  • 我正在为一个CS类做一些家庭作业,并且正在努力使用一个函数来反转两个给定节点之间的双链接列表。我对自己做错了什么感到困惑,我在谷歌上搜索过,但找不到任何有帮助的东西。 我有一个双链表,我基本上使用这个函数作为辅助函数,在两个节点之间反转它,这两个节点作为函数的参数。 下面是模板的代码,有注释以便您了解我的思考过程 那么,有什么想法吗?我已经知道问题发生在哪里,是什么,但是我还不知道为什么会发生,以

  • 当检查链表中的中间节点时,我对同时循环条件在链表中的工作方式感到困惑 这是正确的代码我有找到中间节点的链表 如果我将while循环更改为 或 我收到一个错误,上面写着 我只是想知道为什么拥有第二个代码和second.next代码很重要

  • 我正在尝试编写一个函数,它接受一个项目并将其插入双向链表的前端。双向链表有两个虚拟节点,两端各一个。我迄今为止编写的方法在迭代列表并打印时只返回两个虚拟节点。我无法弄清楚我的代码有什么问题。 当我运行main时,我得到的只是: 然而,我预计: 有谁能告诉我如何修复代码,以便在双链接列表的开头添加一个项目,在两个虚拟的第一个和最后一个节点之间?

  • 我有以下图表: 我正在寻找一种方法来计算从a发送到b和从b发送到c/d的金额之间的差异,这取决于referenceId,但不使用特定的referenceId。 所以我在寻找像下面这样的半代码: 有人知道我该怎么做吗?

  • 本文向大家介绍C++删除链表中间节点的方法,包括了C++删除链表中间节点的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++删除链表中间节点的方法。分享给大家供大家参考,具体如下: 题目: 给定链表头结点head,实现删除链表的中间节点函数。 解题思路及代码: 快慢指针,快指针走两步,慢指针一步。 当快指针走到终点时,慢指针正好是链表中间节点,删除此节点即可。 链表结构定义: 算法

  • 我的问题是,如果用户输入一个姓氏,并且在链接列表中有多个相同的姓氏,并且其中一个姓氏在head节点中。如何在不删除头部节点的情况下删除另一个姓氏。我尝试了一些我能想到的方法,但是删除了所需的节点(这很好),包括头部节点(这不是我想要的…)