zoukankan      html  css  js  c++  java
  • 表达式树

    表达式树

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

    表达式树的性质

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

    构造一棵表达式树

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

    算法思想:
    我们一次一个符号的读入表达式。如果符号是操作数,那么就建立一个单节点树并将它推入栈中。如果符号是操作符,那么就从栈中弹出两棵树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();
    }
    
  • 相关阅读:
    msysgit 上传文件夹,规范化的日常
    第三次作业【补完作业】
    c++我在努力----第三次作业体会
    编程题
    视频课程作业随笔
    HDU 4123 Bob’s Race 树形dp+单调队列
    HDU 4514 湫湫系列故事——设计风景线 树的直径
    POJ 1239 Increasing Sequences 动态规划
    BNUOJ 52318 Be Friends prim+Trie
    HDU 5925 Coconuts 离散化
  • 原文地址:https://www.cnblogs.com/lanqiu5ge/p/9472206.html
Copyright © 2011-2022 走看看