2

私が具体的に話しているコード関数は getCount() です。ここに含めていない他の関数 (このバイナリ ツリーの高さとノードの総数の検出など) がいくつかありますが、これらは問題なく動作し、正しい結果が得られます。一方、getCount() は、最初のノード (ツリーの一番上の最初のノード) を除いて、セグメンテーション違反を生成します。何か案は?

#include <string> 
#include <algorithm>
#include <iostream>

class Word {
    public:
        std::string keyval;
        long long count;
        Word() {
            keyval = "";
            count = 0;
        }
        Word(std::string S) {
            keyval = S;
            count = 1;
        }
};

class WordBST {
    public:
        Word node;
        WordBST* left_child;
        WordBST* right_child;
        WordBST(std::string key);        
        void add(std::string key){
            if (key == node.keyval){
                node.count++;
            }
            else if (key < node.keyval){
                if (left_child == NULL){
                    left_child = new WordBST(key);
                }else {
                    left_child->add(key);
                }
            }else {
                if (right_child == NULL){
                    right_child = new WordBST(key);
                }else {
                    right_child->add(key);
                }
            }
        }
        long long getCount(std::string key){
            if (key == node.keyval){
                return (node.count);
            }
            else if (key < node.keyval){
                left_child->getCount(key);
            }else if(key > node.keyval){
                right_child->getCount(key);
            }else return 0;
            /*else {
                if (key < node.keyval){
                    left_child->getCount(key);
                }else{
                    right_child->getCount(key);
                }
            }*/
        }
};

WordBST::WordBST(std::string key) {
    node = Word(key);
    left_child = NULL;
    right_child = NULL;
}
4

3 に答える 3

2

これは、return ステートメントを実行せずにコードを最後まで実行させたためです。

long long getCount(std::string key){
    if (key == node.keyval){
        return (node.count);
    } else if (left_child && key < node.keyval){
        return left_child->getCount(key); // Added return
    } else if(right_child && key > node.keyval){
        return right_child->getCount(key); // Added return
    }
    return 0;
}

また、コード全体の複数の場所に null チェックを追加する必要があります。あなたのadd方法にはそれらがありますが、あなたにgetCountはありません。

于 2012-07-22T00:58:24.400 に答える
2

getCount() を次のように書くべきだと思います。

    long long getCount(std::string key){
    if (key == node.keyval){
        return (node.count);
    }
    else if (key < node.keyval && left_child != NULL){
        return left_child->getCount(key);
    }else if(key > node.keyval && right_child != NULL){
        return right_child->getCount(key);
    }else return 0;
}
于 2012-07-22T01:09:02.773 に答える
1

メソッドを呼び出す前に、ノードの子が存在するかどうかを確認しません。

于 2012-07-22T00:59:02.213 に答える