使用 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;
}
输出:
The Inorder Traversal of Expression Tree: A + B * C / D