📜  使用 C++ 中的类和实现的表达式树

📅  最后修改于: 2022-05-13 01:55:24.015000             🧑  作者: Mango

使用 C++ 中的类和实现的表达式树

先决条件:表达式树

表达式树是一棵二叉树,其中每个内部节点对应于运算符,每个叶节点对应于操作数,因此例如 3 + ((5+9)*2) 的表达式树将是:

表达式树

在表达式树中,叶节点是操作数,非叶节点是运算符。这意味着表达式树是二叉树,其中内部节点是运算符,叶子是操作数。表达式树由二进制表达式组成。但是对于一元运算运算符,一个子树将为空。

表达式树的构建:

  • 用户将提供一个后缀表达式,程序将为其构建表达式树。
  • 二叉树/表达式树的中序遍历将提供给定输入的中缀表达式。

例子:

Input:  A B C*+ D/
Output: A + B * C / D

第 1 步:前三个符号是操作数,因此创建树节点并将指向它们的指针压入堆栈,如下所示。

创建树节点

第 2 步:在下一步中,将读取运算符'*',因此弹出两个指向树的指针,形成一棵新树并将指向它的指针压入堆栈

新树形成

第 3 步:在下一步中,将读取一个运算符“+”,因此弹出两个指向树的指针,形成一棵新树并将指向它的指针压入堆栈。

压栈

第 4 步:类似地,与上述情况一样,我们首先将“D”压入堆栈,然后在最后一步首先读取“/”,然后像上一步一样,最顶层的元素将弹出,然后将成为根的右子树 '/ ' 和其他节点将是右子树。

最终构造的表达式树是:

最终构造的表达式树

下面是实现上述方法的 C++ 程序:

C++
// C++ program to implement
// the above approach
#include 
using namespace std;
class node {
public:
    char value;
    node* left;
    node* right;
    node* next = NULL;
    node(char c)
    {
        this->value = c;
        left = NULL;
        right = NULL;
    }
    node()
    {
        left = NULL;
        right = NULL;
    }
    friend class Stack;
    friend class expression_tree;
};
  
// Class stack to hold
// tree nodes
class Stack {
    node* head = NULL;
  
public:
    void push(node*);
    node* pop();
    friend class expression_tree;
};
  
// Class to implement
// inorder traversal
class expression_tree {
public:
    // Function to implement
    // inorder traversal
    void inorder(node* x)
    {
        if (x == NULL)
            return;
        else {
            inorder(x->left);
            cout << x->value << "  ";
            inorder(x->right);
        }
    }
};
  
// Function to push values
// onto the stack
void Stack::push(node* x)
{
    if (head == NULL) {
        head = x;
    }
  
    // We are inserting nodes at
    // the top of the stack [
    // following LIFO principle]
    else {
        x->next = head;
        head = x;
    }
}
  
// Function to implement pop
// operation in the stack
node* Stack::pop()
{
    // Poping out the top most[
    // pointed with head] element
    node* p = head;
    head = head->next;
    return p;
}
  
// Driver code
int main()
{
    // Postfix expression
    string s = "ABC*+D/";
  
    Stack e;
    expression_tree a;
    node *x, *y, *z;
    int l = s.length();
  
    for (int i = 0; i < l; i++) {
        // if read character is operator
        // then poping two other elements
        // from stack and making a binary
        // tree
        if (s[i] == '+' || s[i] == '-'
            || s[i] == '*' || s[i] == '/'
            || s[i] == '^') {
            z = new node(s[i]);
            x = e.pop();
            y = e.pop();
            z->left = y;
            z->right = x;
            e.push(z);
        }
        else {
            z = new node(s[i]);
            e.push(z);
        }
    }
  
    // Print the inorder traversal
    cout << " The Inorder Traversal of Expression Tree: ";
    a.inorder(z);
    return 0;
}


输出: