ในปัญหานี้ เราได้รับต้นไม้นิพจน์ที่ประกอบด้วยการดำเนินการไบนารีเช่น +, - , /, * เราต้องทำการประเมินแผนผังนิพจน์แล้วส่งคืนผลลัพธ์
แผนผังนิพจน์ เป็นไบนารีทรีชนิดพิเศษซึ่งแต่ละโหนดประกอบด้วยโอเปอเรเตอร์หรือตัวถูกดำเนินการซึ่งมีการกระจายเป็น−
- โหนดใบของต้นไม้เป็นค่าที่จะดำเนินการ
- โหนดที่ไม่ใช่ใบไม้ประกอบด้วยตัวดำเนินการไบนารี หมายถึงการดำเนินการที่จะดำเนินการ
มาดูตัวอย่างเพื่อทำความเข้าใจปัญหากัน
ป้อนข้อมูล:
ผลลัพธ์: 1
คำอธิบาย:
การถอดรหัสแผนผังนิพจน์
ประสบการณ์ =( (5+9) / (2*7) )
=( 14 / 14 )
=1
แนวทางการแก้ปัญหา:
วิธีแก้ปัญหาอย่างง่ายคือดำเนินการหนึ่งอย่างจากรูท สำหรับตัวถูกดำเนินการ เราจะแก้ปัญหาทรีย่อย เนื่องจากการดำเนินการทั้งหมดเป็นไบนารี โหนดของทรีจึงอาจมีลูกสองคนหรือไม่มีเลย
เราจะใช้การเรียกซ้ำเพื่อแก้ไขการดำเนินการไบนารีของแต่ละโหนด
โปรแกรมเพื่อแสดงการทำงานของโซลูชันของเรา
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class node {
public:
string value;
node *left = NULL, *right = NULL;
node(string x)
{
value = x;
}
};
int solveExpressionTree(node* root) {
if (!root)
return 0;
if (!root->left && !root->right)
return stoi(root->value);
int leftSubTreeSol = solveExpressionTree(root->left);
int rightSubTreeSol = solveExpressionTree(root->right);
if (root->value == "+")
return leftSubTreeSol + rightSubTreeSol;
if (root->value == "-")
return leftSubTreeSol - rightSubTreeSol;
if (root->value == "*")
return leftSubTreeSol * rightSubTreeSol;
if (root -> value == "/")
return leftSubTreeSol / rightSubTreeSol;
return -1;
}
int main()
{
node *root = new node("/");
root->left = new node("+");
root->left->left = new node("9");
root->left->right = new node("5");
root->right = new node("*");
root->right->left = new node("2");
root->right->right = new node("7");
cout<<"The evaluation of expression tree is "<<solveExpressionTree(root);
return 0;
} ผลลัพธ์ -
The evaluation of expression tree is 1