我试图找到大于参数q的下一个最小元素。我接近跟踪q,直到找到的密钥大于q,并返回它。但是,如果该键等于q,我将不得不返回,直到找到我最初离开的前一个节点。我尝试了很多方法,但仍然无法弄清楚我应该在哪里创建指针来跟踪该节点,这样我的代码就会向右移动一次然后一直向左找到密钥。有什么建议吗?
int find_next_larger(tree_node_t *tree, int q)
{
tree_node_t * tmp_node;
tree_node_t * took_left_node = NULL;
if (tree->left == NULL)
return(NULL); // empty tree returns null
else
{
tmp_node = tree;
while (tmp_node-> right != NULL)
{
if (q < tmp_node->key)
{
tmp_node = tmp_node->left; // if q is smaller than node go to left
}
else
{
tmp_node = tmp_node->right; //otherwise go right
}
}
if (tmp_node->key > q)
return tmp_node->left;
else
{
//got stuck here
}
}
}
答案 0 :(得分:0)
我们称这个算法为上限
算法如下:
positive infinity
q
小于当前树的根,则返回min(root, UpperBounded(left subtree))
UpperBounded(right subtree)
我对此进行了最低限度的测试,但如果您发现任何错误,可以在此处报告