二进制搜索树(C ++)中插入的递归函数

时间:2014-10-06 15:13:20

标签: c++ recursion data-structures binary-tree binary-search-tree

我正在尝试使用递归将新节点插入BST 但插入后我失去了链接 有序遍历表明程序只能访问根节点 这是我的计划

BST课程

 class bst
     {
       struct node
        {
          struct node *lchild;
          int info;
          struct node *rchild;  
        }*start;
   public:
    bst();
    void insert(int num,struct node *start);
    void search(int num,struct node *start);
    void display();
    void inorder(node *start);
    struct node *getRoot(){
    return start;
   }
};

插入功能

 void bst :: insert(int num,struct node *ptr)
    {
    if(ptr == NULL)
    {
        ptr = new node;
        ptr->info = num;
        ptr->lchild = NULL;
        ptr->rchild = NULL;     
       if(start == NULL)
         start = ptr;
       return;
    }
    else if(num < ptr->info)
     {
        insert(num,ptr->lchild);
     }
     else if(num > ptr->info)
     {
        insert(num,ptr->rchild);
     }
    else
    {
       cout << "Duplicate element \n";
       return;
    }
   }

主要功能

int main()
{
    bst S;
    int option,key;
    cout << "Enter an element\n";
    cin >> key;
    S.insert(key,S.getRoot());
}

如何在不更改插入函数的返回类型的情况下维护正确的链接?

3 个答案:

答案 0 :(得分:1)

start是否已在某处初始化为NULL

此外,当start不是NULL时,您永远不会将新创建的节点链接到树中:

if(ptr == NULL)
{
    ptr = new node;
    ptr->info = num;
    ptr->lchild = NULL;
    ptr->rchild = NULL;     
   if(start == NULL)
     start = ptr;
   return;
}

您应检查节点的子节点是否为NULL,然后在其中链接新节点。我认为你的递归太过分了。

答案 1 :(得分:0)

将您的start初始化为NULL

    bst()
    {
        start=NULL;
    }

答案 2 :(得分:0)

您需要通过引用传递root。

主要功能

S.insert(key,&S.getRoot());

插入功能

void bst :: insert(int num,struct node **ptr)
{
    if(*ptr == NULL)
    {
        *ptr = new node;
        (*ptr)->info = num;
        (*ptr)->lchild = NULL;
        (*ptr)->rchild = NULL;     
       //if(start == NULL)      //No need for this statement
       //  start = *ptr;        //No need for this statement
       return;
    }
    else if(num < *ptr->info)
     {
        insert(num,&((*ptr)->lchild));
     }
     else if(num > *ptr->info)
     {
        insert(num,&((*ptr)->rchild));
     }
    else
    {
       cout << "Duplicate element \n";
       return;
    }
}