检测二叉搜索树重复项并解决冲突

detecting binary search tree duplicates and solving collisions

提问人:swecpp 提问时间:10/29/2023 最后编辑:swecpp 更新时间:10/29/2023 访问量:72

问:

我正在尝试在二叉搜索树中插入一个节点。此外,如果在尝试插入时遇到重复项,则必须将一个新的 ListNode 添加到树节点内的列表中,其中包含在输入文件中遇到新重复元素的行号。

问题在于,在添加新的树节点时,程序只是将重复的元素添加到树中,而不处理冲突。 我不确定,但也许指针复制有问题?

有我的代码,其中包含节点的结构和问题过程:

struct Node {
   Node* parent{ nullptr };
   Node* left{ nullptr };
   Node* right{ nullptr };

   Carplate* data{};

   ListNode* head{ nullptr };
};
struct ListNode {
   std::uint32_t line_number{};
   ListNode* next{ nullptr };

   ListNode(std::uint32_t number, ListNode* nextNode = nullptr) : 
    line_number{ number }, next{ nextNode }
   {} 

};
void
push(ListNode* head, std::uint32_t line_number) {
    while (head->next != nullptr)
        head = head->next;
    head->next = new ListNode(line_number);
    return;
}

需要修复(如下):

void
insert(Node* &root, const std::string& text, std::uint32_t line_number) {

    Node* newNode{ new Node{} };
    newNode->data = getCarplate(text);
    newNode->head = new ListNode(line_number);

    if (!root) {
        root = newNode;
        return;
    }


    bool nodeIsPlaced{ false };
    Node* current{ root };

    while (nodeIsPlaced == false) {
        if (current->data == newNode->data) {
            std::cout << "update list\n";
            delete(newNode);
            push(current->head, line_number);
            nodeIsPlaced = true;
        }
        else if (newNode->data > current->data) {
            if (current->right != nullptr) {
                current = current->right;
                std::cout << "step right\n";
            }
            else {
                current->right = newNode;
                nodeIsPlaced = true;
            }
        }
        else if (newNode->data < current->data) {
            if (current->left != nullptr) {
                current = current->left;
                std::cout << "step left\n";
            }
            else {
                current->left = newNode;
                nodeIsPlaced = true;
            }
        }
    }
}
C++ 二进制-搜索-树 冲突

评论

1赞 Igor Tandetnik 10/29/2023
current->data == newNode->data您正在比较指针,而不是它们所指向的对象的内容。
0赞 swecpp 10/29/2023
@IgorTandetnik 这难道不是按相应字段取消引用和比较结构的地方吗?
0赞 swecpp 10/29/2023
@IgorTandetnik这很完美,非常感谢!
1赞 JaMiT 10/29/2023
“to the list inside this tree node” -- 等一下。二叉搜索树的节点内有一个列表?我想你跳过了一些有用的上下文。
1赞 Pepijn Kramer 10/29/2023
旁注,我没有看到二叉树类,只有一些暴露的内部节点。这将使你更难保持不变性(不应该改变的东西)。尝试将树代码包装在树类中。其他代码甚至不应该看到节点,只应该看到树上的操作。

答: 暂无答案