二分木を使用して式を評価しようとしています。ツリーには次の特徴があります。
- 各ノードには、0 個、1 個、または 2 個の子があります。
- 演算子を含むノードのみが子を持つことができます。
- すべてのリーフ ノードは数値でなければなりません。
- 簡単にするために、使用できる演算子は
*
およびのみです。+
それらのようなもの:
これは私のツリークラスです:
class ExpressionTree {
struct Node {
std::string data;
Node *leftChild, *rightChild;
Node(std::string d): data(d), leftChild(NULL), rightChild(NULL) {}
} *root;
uint tsize;
public:
ExpressionTree(): root(NULL), tsize(0) {}
Node* treeRoot() { return root; }
void insert(std::string s);
};
そして、これは私の挿入機能です:
void insert(std::string s) {
if (root == NULL) {
root = new Node(s);
++tsize;
} else {
Node* current = root;
while (true) {
if (is_operator(current->data)) {
if (current->leftChild == NULL) {
current->leftChild = new Node(s);
++tsize;
return;
} else if (current->rightChild == NULL) {
current->rightChild = new Node(s);
++tsize;
return;
} else {
if (is_operator(current->leftChild->data)) {
current = current->leftChild;
continue;
} else if (is_operator(current->rightChild->data)) {
current = current->rightChild;
continue;
} else {
std::cout << "Error: only nodes who hold operators"
<< " can have children." << std::endl;
return;
}
}
}
}
}
}
問題はこの関数にあります。二分探索木にノードを挿入する機能から書き始めたのですが、うまくいきません。単純なメイン (を使用しinsert()
て 2 番目のツリーのノードを 1 つずつ追加する) を実行すると、エラーを返さずにクラッシュし、オンライン ソリューションの確認を要求する Windows 7 ダイアログのみが表示されます。
主な問題は、ツリーのすべての要素を検査するのではなく、ブランチのみを検査することであると思います。このため、新しいノードを不正な方法で追加します。残念ながら、これを解決する方法がわかりません。
この質問が具体的すぎないことを願っています。
注:is_operator()
文字列を取り、true
それが+
またはの場合は戻り、*
そうでない場合は false を返します。