簡體   English   中英

二進制搜索樹節點插入

[英]Binary search tree node insertion

想要在二叉樹中插入元素。 該代碼有什么問題。 我有一個數據結構,左和右為自引用結構,根為初始化為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);
    }
}

您在此處建議的代碼存在幾個問題:

  • 您永遠不會將全局變量設置為“ 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);

如此鍵盤上所示

**您已創建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;
    }

}

什么時候將root設置為NULL以外的其他NULL

完成后,實際上如何更改root->leftright

我只是要重寫@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-> 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM