【问题标题】:Search and Inserting in a binary tree recursively递归搜索和插入二叉树
【发布时间】:2014-01-03 08:00:49
【问题描述】:

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

我想做的是编写一个函数“searchInsert”,它将接收一个二叉树和一些整数 i。然后它将尝试在树中找到整数 i。如果不存在,则将其插入树中。

其他信息:如果我们确实在树中找到了整数,则返回一个指向它的节点的指针。如果我们没有像之前所说的那样找到它,请将其插入但返回一个指向树的 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 像给我们的函数一样工作。

任何帮助将不胜感激。

【问题讨论】:

  • 我立即注意到的一件事是它至少很奇怪(如果不是不正确的话)是 keyNode 被分配但从未在两个条件块中使用。我认为值得重新检查您的逻辑。另外,你能告诉我们运行你的函数后树的实际样子吗?
  • “似乎不起作用”具体是什么意思?
  • Cmd - 是的,你是对的,我的大脑似乎没有工作。 @Scott,在运行带有一些测试的代码时。我尝试了给定的树,并且 i = 98。它似乎根本没有插入到树中。我怀疑这与我的回报有关。
  • 请澄清insertTreeNode 的参数应该是什么。它取的是树的根,还是它应该插入的分支?还是别的什么?
  • 它需要一个树的根和一个要搜索的项目。它在插入后返回新树的根。

标签: c recursion tree


【解决方案1】:

在其他问题中,当您意识到您没有找到您正在寻找的项目时,您已经失去了所有上下文:

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 ) ;
}

【讨论】:

    【解决方案2】:

    创建了一个新节点,但它没有链接到树。你永远不会改变你的 leftright 指针。

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

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

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

    或者将函数分成两部分会更简单:search 返回指向现有节点的指针,insert 返回指向根的指针。它们都是递归的并且非常简单。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-15
      • 2021-09-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 2014-01-02
      • 1970-01-01
      相关资源
      最近更新 更多