gpt4 book ai didi

c++ - C++中字符串实现的二叉搜索树

转载 作者:行者123 更新时间:2023-11-27 23:57:16 24 4
gpt4 key购买 nike

我编写了一个将整数值插入二叉搜索树的程序。它似乎工作正常但是当我修改它以接受字符数组而不是整数时,我得到了意想不到的结果。这是我的完整代码:

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;
}

输出:

karan sameer palak jagdish naman umang chandu

预期:

chandu jagdish karan naman palak sameer umang

以前已经有人问过这样的问题,但是有一些编译错误。我的代码没有抛出任何错误,但似乎存在一些逻辑缺陷!

最佳答案

除了 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;
}

关于c++ - C++中字符串实现的二叉搜索树,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41670331/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com