2017-05-15 39 views
1

我在学习如何构建BST树,但在开始之前我想看看它是如何运作的,以便更好地理解这一点。我开始寻找解决方案,我发现这个代码,但是当编译器运行我收到一个错误:BST插入新节点时出现树错误

在功能int main()

main.cpp [Error] no matching function for call to 'BST::insert(node*&, node*&)' 

我不知道原因是我的操作系统或只是我的IDE代码块有问题。

/* 
* C++ Program To Implement BST 
*/ 
# include <iostream> 
# include <cstdlib> 
using namespace std; 
/* 
* Node Declaration 
*/ 
struct node 
{ 
    int info; 
    struct node *left; 
    struct node *right; 
}*root; 

/* 
* Class Declaration 
*/ 
class BST 
{ 
    public: 
     void find(int, node **, node **);  
     void insert(int); 
     void del(int); 
     void case_a(node *,node *); 
     void case_b(node *,node *); 
     void case_c(node *,node *); 
     void preorder(node *); 
     void inorder(node *); 
     void postorder(node *); 
     void display(node *, int); 
     BST() 
     { 
      root = NULL; 
     } 
}; 
/* 
* Main Contains Menu 
*/ 
int main() 
{ 
    int choice, num; 
    BST bst; 
    node *temp; 
    while (1) 
    { 
     cout<<"-----------------"<<endl; 
     cout<<"Operations on BST"<<endl; 
     cout<<"-----------------"<<endl; 
     cout<<"1.Insert Element "<<endl; 
     cout<<"2.Delete Element "<<endl; 
     cout<<"3.Inorder Traversal"<<endl; 
     cout<<"4.Preorder Traversal"<<endl; 
     cout<<"5.Postorder Traversal"<<endl; 
     cout<<"6.Display"<<endl; 
     cout<<"7.Quit"<<endl; 
     cout<<"Enter your choice : "; 
     cin>>choice; 
     switch(choice) 
     { 
     case 1: 
      temp = new node; 
      cout<<"Enter the number to be inserted : "; 
     cin>>temp->info; 
      bst.insert(root, temp); 
     case 2: 
      if (root == NULL) 
      { 
       cout<<"Tree is empty, nothing to delete"<<endl; 
       continue; 
      } 
      cout<<"Enter the number to be deleted : "; 
      cin>>num; 
      bst.del(num); 
      break; 
     case 3: 
      cout<<"Inorder Traversal of BST:"<<endl; 
      bst.inorder(root); 
      cout<<endl; 
      break; 
    case 4: 
      cout<<"Preorder Traversal of BST:"<<endl; 
      bst.preorder(root); 
      cout<<endl; 
      break; 
     case 5: 
      cout<<"Postorder Traversal of BST:"<<endl; 
      bst.postorder(root); 
      cout<<endl; 
      break; 
     case 6: 
      cout<<"Display BST:"<<endl; 
      bst.display(root,1); 
      cout<<endl; 
      break; 
     case 7: 
      exit(1); 
     default: 
      cout<<"Wrong choice"<<endl; 
     } 
    } 
} 

/* 
* Find Element in the Tree 
*/ 
void BST::find(int item, node **par, node **loc) 
{ 
    node *ptr, *ptrsave; 
    if (root == NULL) 
    { 
     *loc = NULL; 
     *par = NULL; 
     return; 
    } 
    if (item == root->info) 
    { 
     *loc = root; 
     *par = NULL; 
     return; 
    } 
    if (item < root->info) 
     ptr = root->left; 
    else 
     ptr = root->right; 
    ptrsave = root; 
    while (ptr != NULL) 
    { 
     if (item == ptr->info) 
     { 
      *loc = ptr; 
      *par = ptrsave; 
      return; 
     } 
     ptrsave = ptr; 
     if (item < ptr->info) 
      ptr = ptr->left; 
    else 
     ptr = ptr->right; 
    } 
    *loc = NULL; 
    *par = ptrsave; 
} 

/* 
* Inserting Element into the Tree 
*/ 
void BST::insert(node *tree, node *newnode) 
{ 
    if (root == NULL) 
    { 
     root = new node; 
     root->info = newnode->info; 
     root->left = NULL; 
     root->right = NULL; 
     cout<<"Root Node is Added"<<endl; 
     return; 
    } 
    if (tree->info == newnode->info) 
    { 
     cout<<"Element already in the tree"<<endl; 
     return; 
    } 
    if (tree->info > newnode->info) 
    { 
     if (tree->left != NULL) 
     { 
      insert(tree->left, newnode); 
    } 
    else 
    { 
      tree->left = newnode; 
      (tree->left)->left = NULL; 
      (tree->left)->right = NULL; 
      cout<<"Node Added To Left"<<endl; 
      return; 
     } 
    } 
    else 
    { 
     if (tree->right != NULL) 
     { 
      insert(tree->right, newnode); 
     } 
     else 
     { 
      tree->right = newnode; 
      (tree->right)->left = NULL; 
      (tree->right)->right = NULL; 
      cout<<"Node Added To Right"<<endl; 
      return; 
     } 
    } 
} 

/* 
* Delete Element from the tree 
*/ 
void BST::del(int item) 
{ 
    node *parent, *location; 
    if (root == NULL) 
    { 
     cout<<"Tree empty"<<endl; 
     return; 
    } 
    find(item, &parent, &location); 
    if (location == NULL) 
    { 
     cout<<"Item not present in tree"<<endl; 
     return; 
    } 
    if (location->left == NULL && location->right == NULL) 
     case_a(parent, location); 
    if (location->left != NULL && location->right == NULL) 
     case_b(parent, location); 
    if (location->left == NULL && location->right != NULL) 
     case_b(parent, location); 
    if (location->left != NULL && location->right != NULL) 
     case_c(parent, location); 
    free(location); 
} 

/* 
* Case A 
*/ 
void BST::case_a(node *par, node *loc) 
{ 
    if (par == NULL) 
    { 
     root = NULL; 
    } 
    else 
    { 
     if (loc == par->left) 
      par->left = NULL; 
     else 
      par->right = NULL; 
    } 
} 

/* 
* Case B 
*/ 
void BST::case_b(node *par, node *loc) 
{ 
    node *child; 
    if (loc->left != NULL) 
     child = loc->left; 
    else 
     child = loc->right; 
    if (par == NULL) 
    { 
     root = child; 
    } 
    else 
    { 
     if (loc == par->left) 
      par->left = child; 
     else 
      par->right = child; 
    } 
} 

/* 
* Case C 
*/ 
void BST::case_c(node *par, node *loc) 
{ 
    node *ptr, *ptrsave, *suc, *parsuc; 
    ptrsave = loc; 
    ptr = loc->right; 
    while (ptr->left != NULL) 
    { 
     ptrsave = ptr; 
     ptr = ptr->left; 
    } 
    suc = ptr; 
    parsuc = ptrsave; 
    if (suc->left == NULL && suc->right == NULL) 
     case_a(parsuc, suc); 
    else 
     case_b(parsuc, suc); 
    if (par == NULL) 
    { 
     root = suc; 
    } 
    else 
    { 
     if (loc == par->left) 
      par->left = suc; 
     else 
      par->right = suc; 
    } 
    suc->left = loc->left; 
    suc->right = loc->right; 
} 

/* 
* Pre Order Traversal 
*/ 
void BST::preorder(node *ptr) 
{ 
    if (root == NULL) 
    { 
     cout<<"Tree is empty"<<endl; 
     return; 
    } 
    if (ptr != NULL) 
    { 
     cout<<ptr->info<<" "; 
     preorder(ptr->left); 
     preorder(ptr->right); 
    } 
} 
/* 
* In Order Traversal 
*/ 
void BST::inorder(node *ptr) 
{ 
    if (root == NULL) 
    { 
     cout<<"Tree is empty"<<endl; 
     return; 
    } 
    if (ptr != NULL) 
    { 
     inorder(ptr->left); 
     cout<<ptr->info<<" "; 
     inorder(ptr->right); 
    } 
} 

/* 
* Postorder Traversal 
*/ 
void BST::postorder(node *ptr) 
{ 
    if (root == NULL) 
    { 
     cout<<"Tree is empty"<<endl; 
     return; 
    } 
    if (ptr != NULL) 
    { 
     postorder(ptr->left); 
     postorder(ptr->right); 
     cout<<ptr->info<<" "; 
    } 
} 

/* 
* Display Tree Structure 
*/ 
void BST::display(node *ptr, int level) 
{ 
    int i; 
    if (ptr != NULL) 
    { 
     display(ptr->right, level+1); 
     cout<<endl; 
     if (ptr == root) 
      cout<<"Root->: "; 
     else 
     { 
      for (i = 0;i < level;i++) 
       cout<<"  "; 
    } 
     cout<<ptr->info; 
     display(ptr->left, level+1); 
    } 
} 
+0

' BST'不在类的主体中声明一个函数'BST :: insert(node *&,node *&)'。 – crashmstr

+0

只有一个“void insert(int);”在类内 – Thomas

+0

那么,你试图调用一个不存在的函数。我不知道为什么你会认为这是你的操作系统或IDE的错误;是你的_! –

回答

2

插入方法的签名声明和定义之间的不同:

... 
void insert(int); 
... 

void BST::insert(node *tree, node *newnode) {...} 
1

问题在于函数定义:void BST::insert(node *tree, node *newnode)。您在类BST中的声明表示一个参数void insert(int);,而不是您在定义中创建的两个参数。编译器将其视为与声明不同的定义。

另外,如果我想补充,你传递一个整数变量类型的定义,而不是两个节点指针

+0

我不明白第二段。 –