C 递归地在二叉树中搜索和插入

C 递归地在二叉树中搜索和插入,c,recursion,tree,C,Recursion,Tree,首先,新年快乐。我正试图修复一段代码,这段代码我被难倒了好几个小时。注意:我不是一个可靠的程序员 我试图做的是编写一个函数searchInsert,它将接受一个二叉树和一些整数I。然后它将尝试在树中查找整数i。如果它不在那里,它将被插入到树中 其他信息:如果我们真的在树中找到了整数,那么返回一个指向它的节点的指针。如果我们没有像前面所说的那样找到它,请将它插入,但返回一个指向树根的指针 我也必须递归地这样做 现在,我使用任意树以及I=98对其进行了测试,如下所示: 在它看起来像什么之前

首先,新年快乐。我正试图修复一段代码,这段代码我被难倒了好几个小时。注意:我不是一个可靠的程序员

我试图做的是编写一个函数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 ) ;
}

新节点已创建,但未链接到树。你永远不会改变你的左指针和右指针

您需要的是在递归调用后更新链接,例如:

else if (i < t->item) {
    t->left = searchInsert(t->left, i);
} ...
但是,当然,如果找到了某个已找到的项,您不能简单地返回指向该项的指针,否则它将破坏树。这是因为任务的语句不是递归的:必须返回根节点或现有内部节点。因此,您可能希望编写一个递归函数,例如,它始终返回指向根的指针,但也通过附加的treelink*参数返回指向已找到项的指针


或者,将函数分为两部分可能更简单:返回指向现有节点指针的搜索和返回指向根的指针的插入。它们都是递归的,非常简单。

我立即注意到的一件事是,如果没有错误的话,至少有一点很奇怪,就是keyNode被分配了,但从未在两个条件块中使用过。我认为有必要重新审视一下你的逻辑。另外,你能告诉我们在运行你的函数后,树实际上是什么样子的吗?什么似乎不起作用,特别是什么意思?Cmd-是的,你是对的,我的大脑似乎不起作用@Scott,在运行带有一些测试的代码时。我尝试了给定的树,I=98。它似乎根本没有插进树里。我怀疑这与我的返回有关。请澄清insertTreeNode的参数应该是什么。它是在树的根上,还是应该插入的树枝上?还是别的什么东西?它需要一棵树的根和一个要搜索的项目。它在插入后返回新树的根。