C 破解老师的伪代码有困难吗
我正在为类做一个二进制搜索树赋值,对于这个函数,我需要遵循我教授的伪代码。不幸的是,我不确定一个具体的细节,她拒绝澄清 伪代码的链接如下:C 破解老师的伪代码有困难吗,c,binary-search-tree,nodes,C,Binary Search Tree,Nodes,我正在为类做一个二进制搜索树赋值,对于这个函数,我需要遵循我教授的伪代码。不幸的是,我不确定一个具体的细节,她拒绝澄清 伪代码的链接如下: 我希望输出将值添加到二元搜索树并返回true,但当前程序只是在我到达需要“node”的部分时抛出一个错误。正如您所提到的,这是一个在二元搜索树中插入节点的函数。参数如下所示 parent是正在检查的节点的父节点。这将通过树的根调用 current是正在检查的父节点的左侧或右侧。第一次调用函数时,如果当前节点的值小于root,则应使用root->left;如
我希望输出将值添加到二元搜索树并返回true,但当前程序只是在我到达需要“node”的部分时抛出一个错误。正如您所提到的,这是一个在二元搜索树中插入节点的函数。参数如下所示
parent
是正在检查的节点的父节点。这将通过树的根调用current
是正在检查的父节点的左侧或右侧。第一次调用函数时,如果当前节点的值小于root,则应使用root->left
;如果值大于root
,则应使用root->right
。如果root
为空,则current
也应为null
if (root == NULL)
{
ret = recursiveInsert(NULL, NULL, node);
}
else if (root->value < node->value)
{
ret = recursiveInsert(root->left, root, node);
}
else if (root-> value > node->value)
{
ret = recursiveInsert(root->right, root, node);
}
else
{
//same value, handle error
}
似乎node->value
是整数类型
考虑到所有这些因素,更新后的代码如下
Node* root = NULL; //global variable
...
bool recursiveInsert(Node* current, Node* parent, Node* node)
{
if (current == NULL)
{
if (parent == NULL)
{
root = node;
}
else
{
if (current->value < parent->value)
{
parent->left = node;
}
else
{
parent->right = node;
}
return true;
}
}
else if(node->value == current->value)
{
return false;
}
else if (parent->value < current->value)
{
recursiveInsert(current->left, current, node);
}
else
{
recursiveInsert(current->right, current, node);
}
}
节点*root=NULL//全局变量
...
布尔递归插入(节点*当前,节点*父节点,节点*节点)
{
如果(当前==NULL)
{
如果(父项==NULL)
{
根=节点;
}
其他的
{
如果(当前->值<父->值)
{
父->左=节点;
}
其他的
{
父->右=节点;
}
返回true;
}
}
else if(节点->值==当前->值)
{
返回false;
}
else if(父级->值<当前->值)
{
递归插入(当前->左侧,当前,节点);
}
其他的
{
递归插入(当前->右侧,当前,节点);
}
}
正如您所提到的,这是一个在二进制搜索树中插入节点的函数。参数如下所示
parent
是正在检查的节点的父节点。这将通过树的根调用current
是正在检查的父节点的左侧或右侧。第一次调用函数时,如果当前节点的值小于root,则应使用root->left
;如果值大于root
,则应使用root->right
。如果root
为空,则current
也应为null
if (root == NULL)
{
ret = recursiveInsert(NULL, NULL, node);
}
else if (root->value < node->value)
{
ret = recursiveInsert(root->left, root, node);
}
else if (root-> value > node->value)
{
ret = recursiveInsert(root->right, root, node);
}
else
{
//same value, handle error
}
似乎node->value
是整数类型
考虑到所有这些因素,更新后的代码如下
Node* root = NULL; //global variable
...
bool recursiveInsert(Node* current, Node* parent, Node* node)
{
if (current == NULL)
{
if (parent == NULL)
{
root = node;
}
else
{
if (current->value < parent->value)
{
parent->left = node;
}
else
{
parent->right = node;
}
return true;
}
}
else if(node->value == current->value)
{
return false;
}
else if (parent->value < current->value)
{
recursiveInsert(current->left, current, node);
}
else
{
recursiveInsert(current->right, current, node);
}
}
节点*root=NULL//全局变量
...
布尔递归插入(节点*当前,节点*父节点,节点*节点)
{
如果(当前==NULL)
{
如果(父项==NULL)
{
根=节点;
}
其他的
{
如果(当前->值<父->值)
{
父->左=节点;
}
其他的
{
父->右=节点;
}
返回true;
}
}
else if(节点->值==当前->值)
{
返回false;
}
else if(父级->值<当前->值)
{
递归插入(当前->左侧,当前,节点);
}
其他的
{
递归插入(当前->右侧,当前,节点);
}
}
伪代码上下文中的节点
是先前分配的节点,包含插入到树中的数据。最初的调用者分配它(这是毫无意义的,在RW代码中从来没有这样做过)。实际上,除非您考虑一个可能将节点从一棵树移动到另一棵树的库,并且您希望避免设置/拆除节点本身的费用,否则实际上不太可能执行此模式
关于算法,它相当简单,但不是很漂亮:
current
和parent
都为空,则表示这必须是树中由某个全局指针root
跟踪的第一个节点。因此,root
被直接分配到传入节点current
为空,但parent
不为空,则表示parent
是树中的某个潜在叶(意味着它有一个左指针、一个右指针或两个包含的指针都为空),并且您已到达空指针。插入需要与父值进行比较,以了解是将节点挂起在左侧还是右侧。请注意,这是低效的,因为您已经进行了此比较(这是您如何首先到达这里的)current
不为空,我们只需检查值是否相等或更小(如果两个值都不为真,则假定值更大),并在保证的情况下进入左或右的子树。在这种情况下,current.left
或current.right
成为递归的current
,并且current
成为所述相同递归调用的父调用
bool recursiveInsert(Node* current, Node* parent, double value)
{
bool result = false;
if (current == NULL)
{
if (parent == NULL)
{
root = malloc(sizeof *root);
root->value = value;
root->left = root->right = NULL;
}
else
{
Node *p = malloc(sizeof *p);
p->value = value;
p->left = p->right = NULL;
if (value < parent->value)
{
parent->left = p;
}
else
{
parent->right = p;
}
result = true;
}
}
else if (value < parent->value)
result = recursiveInsert(current->left, current, value);
else if (parent->value < value)
result = recursiveInsert(current->right, current, value);
return result;
}
它并不漂亮,但却很有效。它依赖于全局根存在可能是该算法最糟糕的部分。多重比较可能是第二个讨厌的地方
另一种方法
理想情况下,树的根作为参数传入。此外,我们可以使算法像现在一样递归,但不再依赖于某些参数
bool recursiveInsert(Node* current, Node* parent, double value)
{
bool result = false;
if (current == NULL)
{
if (parent == NULL)
{
root = malloc(sizeof *root);
root->value = value;
root->left = root->right = NULL;
}
else
{
Node *p = malloc(sizeof *p);
p->value = value;
p->left = p->right = NULL;
if (value < parent->value)
{
parent->left = p;
}
else
{
parent->right = p;
}
result = true;
}
}
else if (value < parent->value)
result = recursiveInsert(current->left, current, value);
else if (parent->value < value)
result = recursiveInsert(current->right, current, value);
return result;
}
recursiveInsert(root, NULL, value);
bool treeInsert(Node **pp, double value)
{
bool result = false;
if (!*pp)
{
*pp = malloc(sizeof **pp);
(*pp)->value = value;
(*pp)->left = (*pp)->right = NULL;
result = true;
}
else if (value < (*pp)->value)
{
result = recursiveInsert(&(*pp)->left, value);
}
else if ((*pp)->value < value)
{
result = recursiveInsert(&(*pp)->right, value);
}
return result;
}
bool treeInsert(Node **pp, double value)
{
bool result = false;
while (*pp)
{
if (value < (*pp)->value)
pp = &(*pp)->left;
else if ((*pp)->value < value)
pp = &(*pp)->right;
else break;
}
if (!*pp)
{
*pp = malloc(sizeof **pp);
(*pp)->value = value;
(*pp)->left = (*pp)->right = NULL;
result = true;
}
return result;
}
treeInsert(&root, value);