zoukankan      html  css  js  c++  java
  • Evaluation of Expression Tree

    Evaluation of Expression Tree

    Given a simple expression tree, consisting of basic binary operators i.e., + , – ,* and / and some integers, evaluate the expression tree.

    Examples:

    Input :
    Root node of the below tree
    pic2
    
    Output :
    100
    
    Input :
    Root node of the below tree
    pic1
    
    Output :
    110
    

    We strongly recommend you to minimize your browser and try this yourself first.

    As all the operators in the tree are binary hence each node will have either 0 or 2 children. As it can be inferred from the examples above , the integer values would appear at the leaf nodes , while the interior nodes represent the operators.
    To evaluate the syntax tree , a recursive approach can be followed .

    Algorithm :
    Let t be the syntax tree
    If  t is not null then
          If t.info is operand then  
             Return  t.info
          Else
             A = solve(t.left)
             B = solve(t.right)
             return A operator B
             where operator is the info contained in t
    
    

    The time complexity would be O(n), as each node is visited once. Below is a C++ program for the same:

     1 #include <iostream>
     2 #include <cstdlib>
     3 using namespace std;
     4 
     5 typedef struct node{
     6     string s;
     7     node *left;
     8     node *right;
     9     node(string x): s(x), left(NULL), right(NULL){}
    10 }Node;
    11 
    12 // Utility function to return the integer value
    13 // of a given string
    14 int toInt(string s){
    15     int len = s.length();
    16     int num = 0;
    17     for(int i = 0; i < len; i++){
    18         num = num * 10 + (s[i]-'0');
    19     }
    20     return num;
    21 }
    22 
    23 // Check which operator to apply
    24 int calculate(const char *c, int lval, int rval){
    25     int ans;
    26     switch(*c){
    27     case '+': ans = lval + rval; break;
    28     case '-': ans = lval - rval; break;
    29     case '*': ans = lval * rval; break;
    30     case '/': ans = lval / rval; break;
    31     }
    32     return ans;
    33 }
    34 
    35 // This function receives a node of the syntax tree
    36 // and recursively evaluates it
    37 int eval(Node *root){
    38     // empty tree
    39     if(root == NULL)
    40         return 0;
    41     // leaf node i.e, an integer
    42     if(root->left == NULL && root->right == NULL)
    43         return toInt(root->s);
    44     // Evaluate left subtree
    45     int lval = eval(root->left);
    46     // Evaluate right subtree
    47     int rval = eval(root->right);
    48     return calculate((root->s).c_str(), lval, rval);
    49 }
    50 
    51 int main()
    52 {
    53     // create a syntax tree
    54     node *root = new node("+");
    55     root->left = new node("*");
    56     root->left->left = new node("5");
    57     root->left->right = new node("4");
    58     root->right = new node("-");
    59     root->right->left = new node("100");
    60     root->right->right = new node("20");
    61     cout << eval(root) << endl;
    62  
    63     delete(root);
    64  
    65     root = new node("+");
    66     root->left = new node("*");
    67     root->left->left = new node("5");
    68     root->left->right = new node("4");
    69     root->right = new node("-");
    70     root->right->left = new node("100");
    71     root->right->right = new node("/");
    72     root->right->right->left = new node("20");
    73     root->right->right->right = new node("2");
    74  
    75     cout << eval(root);
    76     system("pause");
    77     return 0;
    78 }

    100

    110

    参考:http://www.geeksforgeeks.org/evaluation-of-expression-tree/

  • 相关阅读:
    js 添加事件 attachEvent 和 addEventListener 的用法
    zepto的tap事件的点透问题的几种解决方案
    CSS3弹性盒模型flexbox完整版教程
    移动端的几款jq插件
    CSS3阴影 box-shadow的使用
    offset
    事件驱动
    mysql处理重复数据仅保留一条记录
    k8s ingress路由强制跳转至https设置
    linux查看进程数
  • 原文地址:https://www.cnblogs.com/qinduanyinghua/p/5745569.html
Copyright © 2011-2022 走看看