我正在尝试编写简单的二进制搜索树类(BST)。
当我添加一个节点(例如,value = 10)时,root会更新,我在BST :: insert(...)结束时使用VS C ++调试器验证。
然后我尝试显示(Case语句3)节点(值-10)并且没有打印任何内容。原因是,当调用getRoot()时,root为NULL(?? !!!)
有人可以帮我调试这个问题。
#include <iostream>
#include <stdio.h>
#include "bst_node.h"
class BST{
private:
bst_node *root;
public:
bst_node* getRoot();
void insert(bst_node *, int val);
void deleteValue(int val);
void display(bst_node *);
void destroy();
BST()
{
root = NULL;
std::cout<<"BST constructor"<<"\n";
}
~BST()
{
std::cout<<"BST destructor"<<"\n";
}
};
int main()
{
int item;
int choice;
BST tree1;
while(1)
{
printf("\n Choices are:\n");
printf("\n 1.Insertbeg\n\n 2.deleteNode\n\n 3.display\n\n 4.exit\n\n");
printf(" Enter U'r choice: ");
scanf("%d",&choice);
switch(choice)
{
case 1:
{
printf("Enter element to be inserted: ");
scanf("%d",&item);
tree1.insert(tree1.getRoot(), item);
break;
}
case 2:
{
printf("Enter element to be deleted: ");
scanf("%d",&item);
// tree1.deleteValue(item);
break;
}
case 3:
{
tree1.display(tree1.getRoot());
break;
}
case 4:
exit(1);
break;
default: printf("INVALID CHOICE TRY AGAIN\n");
}
}
}
void BST::insert(bst_node* root, int val)
{
if( root == NULL)
{
// add first element
bst_node *new_node = bst_node::create_empty_node();
new_node->val = val;
root = new_node;
}
else if(val < root->val )
{
insert(root->l_child, val);
}
else if (val >= root->val)
{
insert(root->r_child, val);
}
}
void BST::display(bst_node *root)
{
if(root == NULL)
{
return;
}
else
{
std::cout << root->val <<"\n";
display(root->l_child);
display(root->r_child);
}
}
void BST::deleteValue(int val)
{
std::cout<< " Do nothing";
}
bst_node* BST::getRoot()
{
return root;
}
bst_node.h
class bst_node
{
public:
int val;
bst_node *l_child;
bst_node *r_child;
static bst_node* create_empty_node();
};
bst_node* bst_node::create_empty_node()
{
bst_node *new_node;
new_node = new bst_node;
new_node -> l_child = new_node -> r_child = NULL;
return(new_node);
}
答案 0 :(得分:2)
通过将参数命名为root
insert()
,您隐藏私有成员root
。对root
的所有修改都将应用于局部变量。例如,行:
root = new_node;
不会有任何影响。您正在为从未再次使用过的可用状态设置新值。
这样做通常是一种不好的做法(有一些例外,例如setter)。尝试重命名并检查它是否至少解决了一些问题。
答案 1 :(得分:0)
更改void BST::insert(bst_node* root, int val)
到void BST::insert(bst_node*& root, int val)
或void BST::insert(bst_node** root, int val)
没有对该功能进行其他修改的最简单的方法是使用bst_node *&amp;
指针本身只是传递给函数的整数,然后复制此指针,因此更改指针的值不会在函数范围之外更改。对指针的引用将使您在函数范围之外可以进行更改。