没有递归的二叉搜索树插入 C

Binary Search Tree Insertion C without recursion

我是这个页面的新手,我真的被困在我大学的家庭作业中,以重新创建一个无需递归即可将节点插入树的函数。我已获得递归方法,我需要将其转换为迭代方法。这是给定的递归代码:

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

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

这是迭代插入元素的代码。由于要插入的新元素已经 created/allocated,因此没有必要在创建元素后立即初始化结构的 left/right 字段。

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

prev 的(未)使用表示意识到递归结果需要修补。其他人已经给出了解决方案,这里是 "ideal" 解决方案,使用指针别名。

   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;

current会在终点指向root,或者left/right的一个节点;为空。

请注意,别名的这种用法在某些其他语言中不存在,例如 java。 C.

为数不多的优点之一

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