• 表达式树


    表达式树

    表达式树的树叶是操作数,如常数或变量,而其他的节点是操作符,如果所有的操作符均是二元的,则构成一棵二叉树。

    表达式树的性质

    中序遍历 —-> 中缀表达式
    后序遍历 —-> 后缀表达式
    先序遍历 —-> 前缀表达式

    构造一棵表达式树

    把后缀表达式转变成表达式树
    (由于中缀表达式可以转换成后缀表达式,所以也可以实现将中缀表达式转换成后缀表达式,然后再构造相应的表达式树)

    算法思想:
    我们一次一个符号的读入表达式。如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树T1 和 T2(T1先弹出)并形成一棵新的树,该树的根就是操作符,它的左右儿子分别是T2和T1,然后将指向这颗新树的指针亚茹栈中。

    <代码>

    
    struct TreeNode{
        char val;
        TreeNode* left;
        TreeNode* right;
        TreeNode(char x):val(x),left(NULL),right(NULL){}
    };
    
    TreeNode* createExpressTree(string str)
    {
        if(str.empty())
            return NULL;
        stack<TreeNode*> Nodes;
    
        int len = str.size();
        for(int i = 0 ;i < len; i++)
        {
            if(str[i] >= 'a' && str[i] <= 'z')
            {
                TreeNode* node = new TreeNode(str[i]);
                Nodes.push(node);
            }
            else if(str[i] == '+' || str[i] == '-' || str[i] == '*' || str[i] == '/')
            {
                TreeNode* node = new TreeNode(str[i]);
                if(Nodes.empty())
                    return NULL;
                node->right = Nodes.top();
                Nodes.pop();
                if(Nodes.empty())
                    return NULL;
                node->left = Nodes.top();
                Nodes.pop();
    
                Nodes.push(node);
            }
        }
    
        return Nodes.top();
    }
    
  • 相关阅读:
    导航守卫
    asnyc
    扩展运算符 ···
    模版字符串
    iterator迭代器
    箭头函数
    解构
    变量let const
    vueUI可视化
    python图像特征提取
  • 原文地址:https://www.cnblogs.com/lanqiu5ge/p/9472206.html
Copyright © 2020-2023  润新知