二进制搜索树插入C没有递归

时间:2016-04-22 13:22:57

标签: c insert iteration binary-tree binary-search-tree

我是该页面的新手,我真的被困在我大学的家庭作业中,重新创建一个在没有递归的情况下将节点插入树的功能。我得到了递归方法,我需要将其转换为迭代。这是给定的递归代码:

TreeNode *InsertTree(TreeNode *root, TreeNode *newnode)
{
   if (!root)
   {
      root = newnode;
      root->left = root->right=NULL;
   }
   else if (newnode->entry < root->entry)
   {  
      root->left = InsertTree(root->left, newnode);
   }
   else
   {
      root->right = InsertTree(root->right, newnode);
   }
   return root;
}

我做了这个:

TreeNode *InsertTree(TreeNode *root, TreeNode *newnode)
{
   if (!root)
   {
      root = newnode;
      root->left = root->right=NULL;
   }  
   else 
   {
      TreeNode * temp = root, *prev = NULL;

      while(temp)
      {
        if (temp->entry < newnode->entry)
          temp = temp->right;
        else
          temp = temp->left;
      }
      newnode;
      temp->left = temp->right = NULL;
   }
   return root;
}

它适用于第一个元素,但它不会保存其余元素。 有任何想法吗? 提前致谢

2 个答案:

答案 0 :(得分:4)

这是迭代插入元素的代码。由于已经创建/分配了要插入的新元素,因此在创建元素时不会初始化结构的左/右字段。

   TreeNode *InsertTree(TreeNode *root, TreeNode *newnode){

         //assuming newnode->left/right already == NULL
         if(root==NULL){
           root = newnode;
         }
         else {
           TreeNode * prev = NULL;
           TreeNode * curr = root;
           while(curr != NULL){
              prev = curr;
              if(curr -> entry < newnode -> entry) curr = curr -> right;
              else curr = curr -> left;
           }
           if (prev -> entry < newnode -> entry) prev -> right = newnode;
           else prev -> left = newnode;

         }
         return root;
     }

答案 1 :(得分:4)

prev的(un)用法表示需要修补递归结果的意识。正如其他人已经给出了解决方案,这里的理想是&#34;解决方案,使用指针别名。

   TreeNode **current = &root;
   while (*current)
   {
       if (newnode->entry < (*current)->entry)
       {
           current = &(*current)->left;
       }
       else
       {
           current = &(*current)->right;
       }
   }
   *current = newnode;
   newnode->left = newnode->right = NULL;
   return root;

当前将在终点指向节点,或节点的左/右;为空。

请注意,在java等其他语言中不存在这种别名用法。 C的极少数优势之一。

&前缀运算符获取变量的地址。

相关问题