如何为算术表达式创建BST

时间:2015-01-15 04:05:44

标签: c++

我是一个c ++ leaner,我正在尝试为这个表达式创建一个BST树:2346 * + / 8+,并按顺序和后序进行以获取修复版本和表达式的后缀版本。我很难为表达式创建二叉树。这是我的比索代码:

Tree:
Stack:
inorder fn{}
postorder fn{}
main{
  input the file;
    while(expression){
      if(digit){
         s.push}
      else if(operator){
         s.top = right;
         s.pop;
         s.top = left;
         s.pop;
         T1 = new Tree(operator, left, right);
     }
    }

我要创建的树就像这样

           +
          / \
        (/)  8
        / \
       +   2  
      / \
     *   3
    / \
   4   6

我对这段代码的问题是在创建(4 * 6)树之后,我不能用(4 * 6)链接(+3)。请帮帮我。

感谢Drew McGowen,我已经更新了我的代码,现在我将4 * 6树推回堆栈,这里是代码:

while(input_file >> expression){
    if(isdigit(expression[0])){
        sscanf(expression,"%c",&digit);
        printf("reading a number: %c \n",digit);
        Tree* s.push(digit);
    }
    else {
        sscanf(expression,"%c",&oper);
        printf("reading an operator: %c \n",oper);
        T1 = new Tree(s.top(), NULL, NULL);
        s.pop();
        T2 = new Tree(s.top(), NULL, NULL);
        s.pop;
        myTree = new Tree(oper, T1, T2);
        s.push(myTree);

我一直收到错误消息,可以帮我查一下代码。谢谢你们。

大家好,我认为主要部分是在正确的轨道上,但我应该如何修改堆栈功能以接受树?这是我的堆栈功能:

void Stack::Push(char newthing) {
index++;
data[index] = newthing;
}
  void Stack::Pop() {
  if (index > -1) { index--; }
 }
 char Stack::Top() {
 return data[index];

1 个答案:

答案 0 :(得分:1)

您的堆栈似乎包含数字。为了将后置修复符号中的表达式解析为堆栈,堆栈应包含树元素。

伪代码

main{
  input the file;
    while(expression){
      if(digit){
         s.push(new Tree(digit)); //create leaf-element
      }
      else if(operator){
         Tree tr = s.pop();
         Tree tl = s.pop();
         T1 = new Tree(operator,tl,tr);
     }
}

这或多或少也是L(AL)R解析器的工作方式。

关于您的代码:

  • 您应该将订单反转为T2T1,因为您正在从堆栈中弹出;
  • T1T2应该是简单的弹出操作,没有构造函数调用;和
  • 你应该在数字大小写中构造一个树节点(leaf)。

    while(input_file >> expression){
        if(isdigit(expression[0])){
            sscanf(expression,"%c",&digit);
            printf("reading a number: %c \n",digit);
            s.push(new Tree(digit,NULL,NULL)); //create new leaf
        }
        else {
            sscanf(expression,"%c",&oper);
            printf("reading an operator: %c \n",oper);
            T2 = s.top(); //T2 instead of T1 and simple pop
            s.pop();
            T1 = s.top(); //T1 instead of T2 and simple pop
            s.pop;
            myTree = new Tree(oper, T1, T2);
            s.push(myTree);
        }
    }
    

如果输入流是有效的(例如,不是1+12+6),则结果是具有一个元素的堆栈:表达式树的根。