【发布时间】: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