C++ 中字符串实现的二叉搜索树
Binary search tree of strings implementation in c++
我编写了一个将整数值插入二叉搜索树的程序。它似乎工作正常,但是当我修改相同的字符数组而不是整数时,我得到了意想不到的结果。这是我的完整代码:
struct Node{
char data[50];
struct Node* right;
struct Node* left;
};
typedef struct Node* NODE;
NODE createNode(char data[]){
NODE newNode = (NODE) malloc (sizeof(struct Node));
if(!newNode){
cout<<"Not enough memory"<<endl;
exit(-1);
}
newNode->left = NULL;
newNode->right = NULL;
strcpy(newNode->data,data);
return (newNode);
}
void insertNode(NODE* head,char data[]){
NODE newNode = createNode(data);
NODE hold_the_head = *head;
if(*head == NULL){
*head = newNode;
(*head)->right = NULL;
(*head)->left = NULL;
return;
}
while(1){
if((newNode->data>(*head)->data)&&((*head)->right== NULL)){
(*head)->right = newNode;
*head = hold_the_head;
return;
}
else if( newNode->data > (*head)->data ){
(*head) = (*head)->right;
}
else if( (newNode->data < (*head)->data) && ( (*head)->left == NULL ) ){
(*head)->left = newNode;
*head = hold_the_head;
return;
}
else if( newNode->data < (*head)->data ){
(*head) = (*head)->left;
}
}
}
void inOrderTraversal(NODE node){
if(node == NULL)
return;
inOrderTraversal(node->left);
cout<<node->data<<"t";
inOrderTraversal(node->right);
}
int main(){
NODE head = NULL;
insertNode(&head,"karan");
insertNode(&head,"sameer");
insertNode(&head,"palak");
insertNode(&head,"jagdish");
insertNode(&head,"naman");
insertNode(&head,"umang");
insertNode(&head,"chandu");
inOrderTraversal(head);
cout<<endl;
return 0;
}
输出:
卡兰·萨米尔·帕拉克·贾格迪什·纳曼·乌芒·昌杜
预期:
昌杜·贾格迪什·卡兰·纳曼·帕拉克·萨米尔·乌芒
像这样的问题之前已经问过了,但有一些编译错误。我的代码没有抛出任何错误,但似乎存在一些逻辑缺陷!
除了 rachitmanit 的回答,我觉得你在用 C 写,而不是C++。
char data[50];
如果您用C++写作,我建议您使用 std::string
.它可以方便地与==
、<
等进行比较。
NODE newNode = (NODE) malloc (sizeof(struct Node));
旧 C 的malloc
只分配内存,不构造对象(即不调用构造函数)。它应该是:NODE newNode = new Node;
(*head)->right = NULL;
(*head)->left = NULL;
/*etc...*/
NULL
通常是0
,它是一个整数,而不是一个指针。我绝对建议使用nullptr
.
void insertNode(NODE* head,char data[]){
通常,指针参数可能nullptr
,您应该检查它是否是。我建议使用引用,您不必:void insertNode(NODE &head, std::string data){
cout<<endl;
应该std::cout<<std::endl
.
并且不要忘记释放内存。程序分配内存但不释放内存,这将导致内存泄漏。 销毁时struct Node
应释放内存:
struct Node {
std::string data;
Node *right;
Node *left;
~Node() {
delete right;
delete left;
}
};
/* ... */
int main() {
/* ... */
delete head;
return 0;
}
如果是整数,你的"数据"实际上是一个值。而这里的"node->data"是第一个data[]数组块的地址。请记住node->data[0]是一个值。您在这里比较的是地址,而不是实际的"值"。
另外,您必须遵循以下内容:如何比较字符数组中的字符串?
这应该会有所帮助。
相关文章:
- 我可以在没有堆栈的情况下在二叉搜索树中实现迭代器吗?
- 二叉搜索树 - 实现"search"函数
- 二叉搜索树的 C++ 实现中的EXC_BAD_ACCESS错误
- C++二叉搜索树实现不会添加每个元素
- 在C++中实现二叉搜索树,搜索不起作用.尝试打印节点的元素会导致输出崩溃
- C++二叉搜索树实现,动态数组或结构/类
- 二进制搜索树的数组实现
- 二叉搜索树实现C++运行时错误
- C++ 中字符串实现的二叉搜索树
- 二叉搜索树在C++中的实现
- 二叉树搜索的实现和函数声明c++
- C++二进制搜索树的实现
- 在 Java 中实现从预序数组重建二叉搜索树
- 它使用什么样的二进制搜索树来实现“std::set”
- 在我的二叉搜索树实现中找不到指针错误?
- 2-3搜索树在c++中的实现
- 二叉搜索树实现.编译的问题
- 使用模板和unique_ptr实现的二叉搜索树中返回具有最小值的节点
- 用栈实现二叉搜索树的非递归析构
- 二叉搜索树实现(c++)