【问题标题】:Double-Threaded Binary Search Tree - Saving Parent & Grandparent Nodes in Order to Set Threads双线程二叉搜索树 - 保存父节点和祖父节点以设置线程
【发布时间】:2020-01-28 19:38:37
【问题描述】:

对于学校的作业,我需要取一棵二叉搜索树并将其转换为双线程二叉搜索树。我对线程的工作方式有一个大致的了解,但我意识到为了知道线程的确切位置,我需要知道最后插入的节点(上一个)的父节点,以及该节点的父节点好(二回)。但是,在我尝试修改其中一个函数以保存这些值时,我无法完全得到我想要的。

如果有人能准确指出我做错了什么并向我解释,以便我从错误中吸取教训,我将不胜感激。谢谢!

这两个函数都是 BST 本身的类的一部分:

void insert(const Key& k, const E& e) 
{
    root = inserthelp(root, k, e);
    nodecount++;
}
BSTNode<Key, E>* BST<Key, E>::inserthelp(BSTNode<Key, E>* root, const Key& k, const E& it) 
{
    if (root == NULL)  // Empty tree: create node
    {
        return new BSTNode<Key, E>(k, it, NULL, NULL);
    }
    if (k < root->key())
    {
        if (prev != NULL)
            twoBack = prev;
        prev = root;
        root->setLeft(inserthelp(root->left(), k, it));
    }
    else
    {
        if (prev != NULL)
            twoBack = prev;
        prev = root;            
        root->setRight(inserthelp(root->right(), k, it));
    }
    return root;       // Return tree with node inserted
}

【问题讨论】:

  • 左子树中最大的节点将始终指向根,它可能在树的许多层次上。例如,在具有 100 万个节点的平衡树中,有 20 个级别。如果您尝试通过保存祖先来添加线程,则必须保存所有 20 个祖先。这可能不是你想走的路。
  • 两篇您可能会感兴趣的文章:geeksforgeeks.org/convert-binary-tree-threaded-binary-tree-2 和 geeksforgeeks.org/…。请注意,这些仅涵盖右线程。但是左线程是一个相当简单的扩展,你应该能够派生出来。
  • 谢谢!这应该足以帮助我摆脱困境!

标签: c++ recursion data-structures binary-search-tree


【解决方案1】:

由于cmets离开了,这个问题已经回答了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    相关资源
    最近更新 更多