【发布时间】:2013-06-20 14:13:29
【问题描述】:
我正在尝试使用二叉树评估表达式。树有这样的特点:
- 每个节点都有零个、一个或两个子节点。
- 只有包含运算符的节点可以有子节点。
- 所有叶节点必须是数字。
- 为简单起见,唯一允许的运算符是
*和+
类似那些:
这是我的树类:
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(),一次添加第二棵树的节点)时,它崩溃而没有返回任何错误,只有一个要求检查在线解决方案的Windows 7对话框em>。
我认为主要问题是它没有检查树的所有元素,而只检查一个分支,因此它以非法方式附加新节点。不幸的是,我不知道如何解决这个问题。
希望这个问题不要太具体。
注意:is_operator() 接受一个字符串,如果是 + 或 +,则返回 true,否则返回 false。
【问题讨论】:
-
“它会崩溃而不返回任何错误,只有一个要求检查在线解决方案的 Windows 7 对话框”您是否通过调试器运行了您的程序?您可以更准确地了解崩溃的来源。
-
Overflowh:关于这个问题有什么消息吗?
-
@Dr_Sam:嗯,不全是好消息。插入函数现在可以加载图像左侧的小树(我将 else 添加到主 if 以检查嵌套中的错误)。问题在于加载第一棵树(更大的树)。我不知道插入算法是否没有遍历树的所有分支,或者我是否以错误的方式插入值。我添加了一个 print() 函数来检查树是否正确加载。无论如何,现在这个问题被标记为“过于本地化”(我想知道谁决定了多少是“太”),所以它不再重要了。
标签: c++ list expression-trees