我要做的是编写一个函数“searchInsert”,它将接受一个二叉树和一些整数i。然后它将尝试在树中找到整数i。如果不存在,则将其插入树中。
其他信息:如果我们确实在树中找到整数,则返回指向其节点的指针。如果我们之前没有找到它,请将其插入BUT中,返回指向树的 root 的指针。
我也必须递归地做这件事。
现在我使用任意树和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工作,因为它是给我们的函数。
感谢任何帮助。
答案 0 :(得分:0)
除了其他问题之外,当您发现自己没有找到要查找的项目时,您已经失去了所有上下文:
if ( t == NULL ) {
t = insertTreeNode(t, i) ;
}
因此,您始终以insertTreeNode
作为第一个参数调用NULL
。
虽然递归是一种逐步浏览树的好方法,但您可能希望创建一个指针并遍历树,以便在决定调用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 ) ;
}
答案 1 :(得分:0)
创建了一个新节点,但它未链接到树。您永远不会更改left
和right
指针。
您需要的是在递归调用后更新链接,例如:
else if (i < t->item) {
t->left = searchInsert(t->left, i);
} ...
但是当然你不能简单地返回一个指向找到的项目的指针,否则会破坏树。那是因为你的任务语句不是递归的:你必须返回root或现有(内部)节点。所以你可能想写一个递归函数,例如始终返回指向根的指针,但也返回指向找到的项的指针(通过附加的treelink*
参数)。
或者将函数拆分为两个可能更简单:search
返回指向现有节点的指针,insert
返回指向根的指针。它们都是递归的,非常简单。