[英]Search and Inserting in a binary tree recursively
首先新年快乐。 我试图修复一段我已经困扰了几个小时的代码。 (注意:我不是一个可靠的编码器。)
我想做的是编写一个函数“ searchInsert”,该函数将包含一个二叉树和一些整数i。 然后它将尝试在树中找到整数i。 如果不存在,则将其插入树中。
其他信息:如果实际上在树中找到了整数,则返回一个指向其节点的指针。 如果找不到我们之前说过的方法,请将其插入但返回指向树根的指针。
我还必须递归执行此操作。
现在,我已经使用任意树和i = 98对其进行了测试,如下所示:
在它看起来像什么之前。
4
/ \
2 6
/ \ / \
1 3 5 7
之后,它应该是什么样的:
4
/ \
2 6
/ \ / \
1 3 5 7
\
98
但是我的代码似乎不起作用。
treelink searchInsert(treelink t, TreeItem i){
treelink keyNode = NULL;
if (t == NULL) {
t = insertTreeNode(t, i);
} else if(i < t->item){
keyNode = searchInsert(t->left,i);
} else if(i > t->item){
keyNode = searchInsert(t->right,i);
} else {
keyNode = t;
return keyNode;
}
return t;
}
其他重要说明:treelink是指向二叉树的指针。 假设insertTreeNode可以正常工作,因为它是给我们的一个函数。
任何帮助,将不胜感激谢谢。
除其他问题外,当您意识到找不到所需的项目时,您已经失去了所有上下文:
if ( t == NULL ) {
t = insertTreeNode(t, i) ;
}
因此,您始终以NULL
作为第一个参数调用insertTreeNode
。
尽管递归是遍历树的好方法,但您可能想创建一个指针并遍历树,以便在决定调用insert时具有原始的t
。
{
treelink ptr= t ;
while ( ptr )
{
if ( ptr-> item == i ) return ptr ;
ptr= ( ptr-> item > i ) ? ptr-> left : ptr-> right ;
}
return insertTreeNode( t, i ) ;
}
创建了一个新节点,但未将其链接到树。 你永远不改变你的left
和right
指针。
您需要在递归调用后更新链接,例如:
else if (i < t->item) {
t->left = searchInsert(t->left, i);
} ...
但是,当然,您不能简单地将指针返回到找到的项目(如果找到),否则会破坏树。 这是因为任务的语句不是递归的:您必须返回root或现有(内部)节点。 因此,您可能想编写一个递归函数,例如,它总是返回指向根的指针,但也返回指向找到的项的指针(通过附加的treelink*
参数)。
或者将函数分为两个部分可能更简单: search
将返回指向现有节点的指针, insert
将返回指向根节点的指针。 它们都将是递归的并且非常简单。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.