【发布时间】:2020-05-02 15:19:38
【问题描述】:
我正在尝试用 C 语言构建自己的二叉搜索树 (BST) 库。但是,我发现很难插入或打印出整个二叉树。详细来说,这是每个 Binary Node 的结构体,其中 Object 已经预定义。
struct BinaryNode
{
Object item;
BinaryNode *left;
BinaryNode *right;
};
这是insert操作的源代码,它完全遵循了二叉搜索树的属性,如下所示。 root 指针是保存二叉搜索树头部的全局变量,Newnode() 是创建新节点以插入二叉搜索树的函数。
BinaryNode *insert(BinaryNode *tree, Object datain)
{
if (tree == NULL)
{
return Newnode(datain);
}
else
{
BinaryNode *temp = Newnode(datain);
root = tree;
while(tree != NULL)
{
if (datain.key < tree->item.key)
tree = tree->left;
else if (datain.key > tree->item.key)
tree = tree->right;
else
break; //Break to insert into the proper place
}
tree = temp;
return root;
}
}
这是我的printTree() 函数的源代码,我相当保证我在这里没有出错。但是,我仍然在这里提供它以澄清我的问题。
oid printTree(BinaryNode *tree)
{
if (tree == NULL)
return;
printTree(root->left);
printf("(%d - %s)-> ", tree->item.key, tree->item.name);
printTree(root->right);
}
我的问题:我的检查程序的输出是它只打印出树的第一个节点。当我调试我的源代码时,我发现除了第一次插入之外,它没有包含新创建的节点。但是,我不知道如何解决它,因为我认为我的程序在逻辑上仍然是算法。
【问题讨论】:
-
在
else分支中,您永远不会创建新节点。 (这看起来好像代码想要递归,在这种情况下,您最终会遇到 null 情况。) -
@MOehm 很抱歉,因为我给了你所有旧版本的源代码。我已经编辑过了,请你再看一遍好吗?
-
好吧,
temp和tree只是局部变量,从外部看不到。当您说return root、temp和tree退出 scpoe 时,它们将无效。您必须将指向新节点的指针存储在父节点的left或right成员中。 -
@MOehm 我还是不明白你的想法。你说得对,
temp和tree是局部变量,我倾向于这样做,因为我想用tree做所有事情,而不用担心泄漏或丢失 BST 的地址节点。最后,我将返回root以返回 BST 的头部,这样就可以了。从我的源代码中可以看出,我必须将节点的地址更改为while()循环中的适当位置。但是,它不能在那个地方插入 -
也许您不想将根设置为树? (while 循环内的第一行)似乎这可能会导致一些意想不到的事情。 root 将不再指向树的头部
标签: c data-structures binary-tree binary-search-tree