以递归方式在二叉树中搜索和插入

时间:2014-01-02 23:48:01

标签: c recursion tree

首先祝新年快乐。我试图修复一段我已被困扰了几个小时的代码。 (注意:我不是一个可靠的程序员。)

我要做的是编写一个函数“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工作,因为它是给我们的函数。

感谢任何帮助。

2 个答案:

答案 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)

创建了一个新节点,但它未链接到树。您永远不会更改leftright指针。

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

else if (i < t->item) {
    t->left = searchInsert(t->left, i);
} ...

但是当然你不能简单地返回一个指向找到的项目的指针,否则会破坏树。那是因为你的任务语句不是递归的:你必须返回root或现有(内部)节点。所以你可能想写一个递归函数,例如始终返回指向根的指针,但也返回指向找到的项的指针(通过附加的treelink*参数)。

或者将函数拆分为两个可能更简单:search返回指向现有节点的指针,insert返回指向根的指针。它们都是递归的,非常简单。