【问题标题】:Binary search tree of strings implementation in c++C++中字符串实现的二叉搜索树
【发布时间】:2017-01-16 06:04:13
【问题描述】:

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

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

输出:

卡兰·萨米尔·帕拉克·贾格迪什·纳曼·乌芒·昌杜

预期:

chandu jagdish karan naman palak sameer umang

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

【问题讨论】:

    标签: c++ string binary-search-tree


    【解决方案1】:

    除了 rachitmanit 的回答,我觉得你是在用 C 编写,而不是 C++。

    char data[50];
    

    如果您使用 C++ 编写,我建议使用 std::string。可以方便地与==&lt;等进行比较。

    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 &amp;head, std::string data){

    cout<<endl;
    

    应该是std::cout&lt;&lt;std::endl

    别忘了释放内存。您的程序分配了内存并且没有释放它,这将导致内存泄漏。 struct Node 销毁时应该释放内存:

    struct Node {
        std::string data;
        Node *right;
        Node *left;
        ~Node() {
            delete right;
            delete left;
        }
    };
    /* ... */
    int main() {
        /* ... */
        delete head;
        return 0;
    }
    

    【讨论】:

    • 非常感谢..!!实际上我确实尝试过使用字符串而不是字符数组。但是有一个分段错误,我无法解决它所以我决定使用字符数组!
    • 同样,malloc 不调用任何构造函数,因此不调用成员 std::string 的构造函数。可能这就是您遇到分段错误的原因。
    • 那是我不知道的!非常感谢!
    【解决方案2】:

    如果是整数,您的“数据”实际上是一个值。而这里的“node->data”是data[]数组的第一个块的地址。记住 node->data[0] 是一个值。您在这里比较的是地址而不是实际的“值”。

    另外,你必须遵循这个:How to compare string in an character array?

    这应该会有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-04-17
      • 2013-05-03
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 2011-07-02
      • 2015-07-23
      • 1970-01-01
      相关资源
      最近更新 更多