无递归的二叉搜索树插入C

无递归的二叉搜索树插入C,c,insert,iteration,binary-tree,binary-search-tree,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 (newn

我对这个页面还不熟悉,我真的被困在了我大学的家庭作业中,无法重新创建一个在树中插入节点而无需递归的函数。我已经得到了递归方法,我需要将其转换为迭代方法。这是给定的递归代码:

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*插入树(TreeNode*根,TreeNode*新节点)
{
如果(!root)
{
根=新节点;
根->左=根->右=空;
}
else if(newnode->entryentry)
{  
根->左=插入树(根->左,新节点);
}
其他的
{
根->右=插入树(根->右,新节点);
}
返回根;
}
我做了这个:

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;
}
TreeNode*插入树(TreeNode*根,TreeNode*新节点)
{
如果(!root)
{
根=新节点;
根->左=根->右=空;
}  
其他的
{
TreeNode*temp=root,*prev=NULL;
while(临时)
{
如果(临时->条目<新节点->条目)
温度=温度->右侧;
其他的
温度=温度->左侧;
}
新节点;
临时->左=临时->右=空;
}
返回根;
}
它适用于第一个元素,但不保存其余元素。 有什么想法吗?
提前感谢

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

   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;
     }
TreeNode*插入树(TreeNode*根,TreeNode*新节点){
//假设newnode->left/right已经==NULL
if(root==NULL){
根=新节点;
}
否则{
TreeNode*prev=NULL;
TreeNode*curr=根;
while(curr!=NULL){
上一次=当前;
如果(curr->entryentry)curr=curr->right;
否则当前=当前->左侧;
}
如果(prev->entryentry)prev->right=newnode;
else-prev->left=newnode;
}
返回根;
}
使用
prev
表示意识到递归结果需要修补。由于其他人已经给出了一个解决方案,这里是使用指针别名的“理想”解决方案

   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;
TreeNode**current=&root;
while(*当前)
{
如果(新建节点->条目<(*当前)->条目)
{
电流=&(*电流)->左侧;
}
其他的
{
当前=&(*当前)->右侧;
}
}
*当前=新节点;
newnode->left=newnode->right=NULL;
返回根;
电流将在端点处指向根,或节点的左/右;是空的

请注意,别名的这种用法在其他一些语言(如java)中并不存在。C语言为数不多的优点之一


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

对于非根的情况,您的代码从不将
newnode
指针指定为树中已存在的任何节点的子节点。@Roux,尽管他可能有意这样做,但这并不能解决他的问题,因为
temp
只是一个局部变量。a(在代码的倒数第二行中缺失。@JoopEggen工作正常非常感谢您的帮助!