2011-03-23 63 views
3

我目前正在为二叉树编写一个C++。然而,无论我想评估什么样的表达式,整个事情都会被编写,我一直有命令提示符告诉我-1。#IND。任何想法修复这个,甚至这意味着什么?-1 #IND问题

在此先感谢

代码:

#include <iostream> 
#include <string> 
#include <cctype> 
using namespace std; 
template<typename T> struct TreeNode 
{ 
    TreeNode(const T& value, TreeNode<T>* left = NULL, TreeNode<T>* right = NULL) 
    { 
     Value = value; 
     Left = left; 
     Right = right; 
    } 

    T Value; 
    TreeNode<T>* Left; 
    TreeNode<T>* Right; 

    bool IsLeaf() const 
    { 
     return Left == NULL && Right == NULL; 
    } 
}; 


double ValueOf(TreeNode<char>* treeNode) 
{ 


    if (treeNode->IsLeaf()) 
    { 
     return treeNode->Value - '0'; 
    } 
    else 
    { 
     switch(treeNode->Value) 
     { 
     case '+': 
      return ValueOf(treeNode->Left) + ValueOf(treeNode->Right); 
      break; 

     case '-': 
      return ValueOf(treeNode->Left) - ValueOf(treeNode->Right); 
      break; 

     case '*': 
      return ValueOf(treeNode->Left) * ValueOf(treeNode->Right); 
      break; 

     case '/': 
      return ValueOf(treeNode->Left)/ValueOf(treeNode->Right); 
      break; 
     } 


    } 
} 



void main() 
{ 
    string expression; 

    cout << "Please enter an expression: "; 

    cin >> expression; 


    TreeNode<char> *newLeaf; 
    TreeNode<char> *treeRoot; 
    TreeNode<char> *currentNode; 
    TreeNode<char> *newRoot; 
    TreeNode<char> *newChild; 


    treeRoot = NULL; 
    currentNode = treeRoot; 


    for (int i = 0; i < expression.length(); i++) 
    { 

     if ((expression[i] >= 0) || (expression[i] <= 9)) 
     { 

      newLeaf = new TreeNode <char> (expression[i]); 


      if (currentNode == NULL) 
      { 
       treeRoot = currentNode = newLeaf; 
      } 
      else 
      { 
       currentNode->Right = newLeaf; 
      } 
     } 

     else if (((expression[i] == '+' || expression[i] == '-') || (expression[i] == '*' || expression[i] == '/')) && currentNode->Right == NULL) 
     { 
      newRoot = new TreeNode <char> (expression[i]); 
      newRoot->Left = treeRoot; 
      treeRoot = newRoot; 
      currentNode = newRoot; 
     } 

     else if (expression[i] == '*' || expression[i] == '/') 
     { 
      newChild = new TreeNode <char> (expression[i]); 
      newChild->Left = currentNode->Right; 
      currentNode->Right = newChild; 
      currentNode = newChild; 
     } 
    } 

    double result = ValueOf(treeRoot); 
    cout << "The result is: " << result << endl; 
    system("pause"); 
} 
+3

“我有一辆车,不管我怎么把钥匙打开,为什么?”如果没有看到整辆汽车,就不能告诉你......向我们展示你的代码,你的输入是什么,你期望什么,以及你得到了什么。 – GManNickG 2011-03-23 23:05:36

+0

你有先生。 – Mike 2011-03-23 23:21:57

回答

3

ValueOf功能会悄悄地返回随机废话,如果碰巧要传递的东西是不是叶和没有价值的四则运算,运算的人物之一。在那种情况下,试图展示那种随意的废话会产生各种疯狂的结果。如果代码的其余部分保证不会发生,这并不重要。不幸的是...

我假设的代码是用来解析表达式,可以很容易地产生这样的事情。例如,假设你输入表达式12。然后首先创建一个包含1的节点;那么创建一个2并作出1节点的正确子节点。这意味着后者不再被认为是一片叶子。砰。

现在,这当然不是你想到的那种表情。那么,为什么当你输入1+2时不行呢?嗯,这里是一个的杀了你的主要事情:

if ((expression[i] >= 0) || (expression[i] <= 9)) 

这应该是&&,不||。所以你的解析器的其他部分根本不会被使用! (当然,你最终会得到一棵树,没有丝毫的意义。)

+0

即使您更改了||,您仍然有其他问题到&&,因为您的输入数据是字符,但您将它们与数字值进行比较。字符'0 ..'9'不在0..9的范围内,因此您永远不会为您的数字构建叶节点。 – 2011-03-23 23:51:48

+0

非常感谢你,现在已经修复了-1#IND,但是现在无论我输入它的表达式BinaryTree在命令提示符下都停止工作。尽管谢谢你的详细答案。 – Mike 2011-03-23 23:52:27

+0

(你用字符替换数字按乔的言论?) – 2011-03-23 23:54:05