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

Binary search tree of strings implementation in c++

本文关键字:搜索树 实现 字符串 C++      更新时间:2023-10-16

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

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]是一个值。您在这里比较的是地址,而不是实际的"值"。

另外,您必须遵循以下内容:如何比较字符数组中的字符串?

这应该会有所帮助。