二进制搜索树节点插入

时间:2014-02-03 15:52:26

标签: c++ data-structures

想在二叉树中插入元素。这段代码有什么问题。我有一个带有数据的结构,左边和右边是自引用结构,root是一个初始化为NULL的类型结构的全局变量。

void insert(struct tree_node *root,int data)
{
    if(root == NULL)
    {
        tree_node *new_node = new tree_node();

        new_node->left = NULL;
        new_node->right = NULL;
    }
    else if(root->data > data)
    {
        insert(root->left,data);
    }
    else
    {
    insert(root->right,data);
    }
}

4 个答案:

答案 0 :(得分:2)

您建议的代码有几个问题:

  • 您永远不会将全局变量设置为“root”。此外,全局变量始终是一件坏事(特别是如果您打算使用线程)。
  • 您永远不会将新条目链接到现有结构。
  • 您永远不会设置新的条目数据

您应该尝试这样做:

struct tree_node *insert(struct tree_node *root, int data) 
{
  if(root == NULL) {
    struct tree_node *new_node = new tree_node();

    new_node->data = data;
    new_node->left = NULL;
    new_node->right = NULL;

    return new_node;
  } else if(root->data > data) {
    root->left = insert(root->left, data);
  } else {
    root->right = insert(root->right, data);
  }

  return root;
}

你可以用

打电话
root = insert(root, data);

as shown on this codepad

答案 1 :(得分:2)

**您已经创建了new_node但没有为其赋值。所以您无法为其插入值。

您还可以使用非递归函数来插入

void insert_nrec(int m)  //for insert in binary tree
{
node *tmp,*par,*ptr;
ptr=root;
par=NULL;
tmp=NULL;
    while(ptr!=NULL)
    {
        par=ptr;
        if(m<ptr->data)
        {   ptr=ptr->lchild;    }
        else if(m>ptr->data)
        {   ptr=ptr->rchild;    }
        else
            {   
                cout<<"duplicate key found::";
                return;             
            }       

    }
tmp=new node;
tmp->data=m;
tmp->lchild=NULL;
tmp->rchild=NULL;
if(par==NULL)
    {
        root=tmp;
    }   
else if(m<par->data)
    {
        par->lchild=tmp;    
    }
else
    {
        par->rchild=tmp;
    }

}

答案 2 :(得分:1)

什么时候将root设置为NULL以外的任何其他内容?

一旦你这样做,你如何实际改变root->leftright

答案 3 :(得分:0)

我只是要重写@TheRealNeo的漂亮'功能'答案,以便你传递一个对根指针的引用:

void insert(struct tree_node * &root, int data) 
{
  if(root == NULL) {
    struct tree_node *new_node = new tree_node();

    new_node->data = data;
    new_node->left = NULL;
    new_node->right = NULL;

    root = new_node;
  } else if(root->data > data) {
    insert( root->left, data);
  } else {
    insert( root->right, data);
  }
}

你用

打电话

insert(root, data);

这相对于功能性的一个优点是,编译器很可能实际上将递归调用作为“尾递归”,即当插入左,而不是进行递归调用时,代码将简单地改变' root'引用引用'root-&gt; left'并跳回到函数的开头。

显式非递归形式不是很清楚,因为它涉及一些指向指针的东西,但它真的不是那么糟糕:

void insert(struct tree_node * &root, int data) 
{
  struct tree_node **ptrp = &root;

  while(*ptrp != NULL ){
     struct tree_node *np = *ptrp;
     if( np->data > data ){
          ptrp = &np->left;
     }else{
          ptrp = &np->right;
     }
  }
   // new node will be placed at *ptrp, a location
   // currently containing NULL.

  struct tree_node *new_node = new tree_node();

  new_node->data = data;
  new_node->left = NULL;
  new_node->right = NULL;

  *ptrp = new_node;
}