表达式树计算错误
Expression Tree Evaluating Error
这是我必须为类创建的表达式树,但是调用evaluate函数时不显示任何内容。你知道我哪里做错了,或者我遗漏了什么吗?从我们在课堂上学到的,它看起来应该运行。
#include <iostream>
#include <string>
using namespace std;
class TreeNode //Leaf Node
{
public:
TreeNode(char key, int data, TreeNode* p) //constructor
{
this->key = key;
this->data = data;
n = 1;
left = NULL;
right = NULL;
parent = p;
}
TreeNode * left;
TreeNode * right;
TreeNode * parent;
char key;
int data;
int n;
};
class ExpressionTree //expression tree
{
public:
void create(); //creates binary expression tree
TreeNode * root; //instance of TreeNode
int Evaluate(TreeNode * n); //evaluates tree
void InOrder(TreeNode * n); //traverses tree InOrder
void PreOrder(TreeNode *n); //traverses tree PreOrder
void PostOrder(TreeNode *n); //traverses tree PostOrder
};
void ExpressionTree::create() //creates binary expression tree
{
root = new TreeNode('*',3,0 );
root->left = new TreeNode('+',5,root);
root ->left->left = new TreeNode('2',2,root->left);
root ->left->right = new TreeNode('3',3,root->left);
root->right = new TreeNode('5',5,root);
}
int ExpressionTree::Evaluate(TreeNode *n) //Evaluates tree
{
int answer = 0;
switch(n->key) //switch statement to decide what operator is being used
{
case '+':
answer = (Evaluate(n->left)+ Evaluate(n->right));
break;
case '-':
answer = (Evaluate(n->left)- Evaluate(n->right));
break;
case '*':
answer = (Evaluate(n->left)* Evaluate(n->right));
break;
case '/':
answer = (Evaluate(n->left)/ Evaluate(n->right));
break;
}
return answer; //returns answer
}
void ExpressionTree::InOrder(TreeNode * n) //traverses the tree InOrder
{
if ( n ) {
InOrder(n->left);
cout << n->key << " ";
InOrder(n->right);
}
}
void ExpressionTree::PreOrder(TreeNode * n) //traverses the tree PreOrder
{
if ( n ) {
cout << n->key << " ";
PreOrder(n->left);
PreOrder(n->right);
}
}
void ExpressionTree::PostOrder(TreeNode * n)//traverses the tree PostOrder
{
if ( n ) {
PostOrder(n->left);
PostOrder(n->right);
cout << n->key << " ";
}
}
int main() //main program
{
ExpressionTree * mytree; //creates instance of ExpressionTree
mytree->create();
cout<<"The Answer is: "<<endl;
mytree->Evaluate(mytree->root);
cout<<endl;
cout<<"In InOrder"<<endl;
mytree->InOrder(mytree->root);
cout<<endl;
cout<<"In PreOrder"<<endl;
mytree->PreOrder(mytree->root);
cout<<endl;
cout<<"In PostOrder"<<endl;
mytree->PostOrder(mytree->root);
cout<<endl;
}
-
在使用
之前未能实例化ExpressionTreeExpressionTree* mytree = new ExpressionTree(); // THIS! mytree->create();
-
打印评估值失败
cout<<"The Answer is: "<<endl; cout << mytree->Evaluate(mytree->root); // THIS!
-
您未能处理
Evaluate
中的叶节点int ExpressionTree::Evaluate(TreeNode *n) { //Evaluates tree switch(n->operation) { //switch statement to decide what operator is being used case '+': return (Evaluate(n->left) + Evaluate(n->right)); case '-': return (Evaluate(n->left) - Evaluate(n->right)); case '*': return (Evaluate(n->left) * Evaluate(n->right)); case '/': return (Evaluate(n->left) / Evaluate(n->right)); } return n->data; // THIS! }
现在你只剩下大量的内存管理地狱,和一个相当无用的树表示(除非你实现,例如一个解析器返回一个)。
另外,在TreeNode
元素上有许多容易出错的不变量,Evaluate
可以是treenode的虚成员,并且可以有虚的、一元的和二值的表达式树节点(虚的表示值)。
这是一个删除了内存管理错误的版本(保留异常安全作为练习):Live On Coliru
#include <iostream>
#include <string>
using namespace std;
class TreeNode { //Leaf Node
TreeNode(TreeNode const&); // no copy
TreeNode& operator=(TreeNode const&); // no copy
public:
TreeNode(char operation, int data, TreeNode* p)
: left(0), right(0), parent(p),
operation(operation), data(data)
{ //constructor
}
~TreeNode() {
delete left;
delete right;
left = right = 0;
}
TreeNode* left;
TreeNode* right;
TreeNode* parent;
char operation;
int data;
};
class ExpressionTree { //expression tree
ExpressionTree(ExpressionTree const&); // no copy
ExpressionTree& operator=(ExpressionTree const&); // no copy
public:
ExpressionTree() : root(0) {}
void create(); //creates binary expression tree
TreeNode* root; //instance of TreeNode
int Evaluate(TreeNode * n); //evaluates tree
void InOrder(TreeNode * n); //traverses tree InOrder
void PreOrder(TreeNode *n); //traverses tree PreOrder
void PostOrder(TreeNode *n); //traverses tree PostOrder
~ExpressionTree()
{
delete root;
root = 0;
}
};
void ExpressionTree::create() { //creates binary expression tree
root = new TreeNode('*', 3, 0);
root->left = new TreeNode('+', 5, root);
root->left->left = new TreeNode('2', 2, root->left);
root->left->right = new TreeNode('3', 3, root->left);
root->right = new TreeNode('5', 5, root);
}
int ExpressionTree::Evaluate(TreeNode *n) { //Evaluates tree
switch(n->operation) { //switch statement to decide what operator is being used
case '+': return (Evaluate(n->left) + Evaluate(n->right));
case '-': return (Evaluate(n->left) - Evaluate(n->right));
case '*': return (Evaluate(n->left) * Evaluate(n->right));
case '/': return (Evaluate(n->left) / Evaluate(n->right));
}
return n->data;
}
void ExpressionTree::InOrder(TreeNode * n) { //traverses the tree InOrder
if(n) {
InOrder(n->left);
cout << n->operation << " ";
InOrder(n->right);
}
}
void ExpressionTree::PreOrder(TreeNode * n) { //traverses the tree PreOrder
if(n) {
cout << n->operation << " ";
PreOrder(n->left);
PreOrder(n->right);
}
}
void ExpressionTree::PostOrder(TreeNode * n) { //traverses the tree PostOrder
if(n) {
PostOrder(n->left);
PostOrder(n->right);
cout << n->operation << " ";
}
}
int main() { //main program
ExpressionTree* mytree = new ExpressionTree();
mytree->create();
cout<<"The Answer is: "<<endl;
cout << mytree->Evaluate(mytree->root);
cout<<endl;
cout<<"In InOrder"<<endl;
mytree->InOrder(mytree->root);
cout<<endl;
cout<<"In PreOrder"<<endl;
mytree->PreOrder(mytree->root);
cout<<endl;
cout<<"In PostOrder"<<endl;
mytree->PostOrder(mytree->root);
cout<<endl;
delete mytree;
}
相关文章:
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- OpenCV - Python 断言错误:SAD 算法 - 立体相机视差图计算
- 如何在常量计算表达式中获取编译时错误?
- 计算阶乘的 C++17 倍表达式中的错误
- 为什么 2 个双精度值之间的差值计算错误?
- 我在c++中遇到了一个奇怪的错误,其中一个计算2个小整数加法的语句溢出到一个长值中
- 错误 C2064:术语的计算结果不是采用 3 个参数的函数
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- C++ openmp 并行计算计算错误的结果
- 为什么按位运算符在使用与整数中提供的位数相同的位数计算可能的最大范围时会产生错误
- 术语不计算为函数采用 1 个参数错误?
- Travis CI 中奇怪的编译器错误不会在本地计算机上发生
- 点云库:计算筛选关键点 - 输入云错误
- 在线程错误 C2064 中:term 的计算结果不为 0 个参数的函数
- GetAsyncKeyState(VK_RETURN) 错误地计算为 true
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- log2 计算在 CPP 中给出了错误的结果
- 错误计算RSI或错误在MetaTrader 4
- c++程序错误计算