【问题标题】:arithmetic expression tree using c language使用c语言的算术表达式树
【发布时间】:2012-09-24 13:19:11
【问题描述】:

我需要弄清楚如何创建算术表达式树。

我可以只使用一组数字来创建简单的二叉树。下面有一个代码示例:

这是我的树的简单节点。

typedef struct _node {
    int key;
    struct _node *left, *right;
} node;

这就是我向二叉树添加新节点的方式:

node* add_tree(node *root, int val) {    
    if(NULL == root) {
        root = crnode(val);
    }    
    if (val < root->key) {
        if (NULL == root->left) {
            root->left = crnode(val);
        }
        else {
            add_tree(root->left, val);
        }
    }

    if (val > root->key) {
        if (NULL == root->right) {
            root->right = crnode(val);
        }
        else {
            add_tree(root->right, val);
        }
    }    
    return root;
}

这是我向树中添加新数字的主要功能和步骤:

int main(int argc, const char * argv[])
    {    
        node *tree = add_tree(NULL, 5);
        tree = add_tree(tree, 6);
        tree = add_tree(tree, 7);
        tree = add_tree(tree, 3);
        return 0;
    }

我的问题是:如何转换这段代码,我不仅可以使用数字,还可以使用运算符(例如 + - / *)。

例如,我需要将表达式 5 * (10 - 5) + 6 * 4 转换为树。我怎样才能做到?

【问题讨论】:

  • 因为这听起来很像家庭作业,所以我不会提供任何代码,但我会在设计方面提供一点帮助。根据树的概念,您会在您发布的这样一个表达式中看到什么更适合“根”节点而不是“叶子”?换句话说,您如何将该表达式概括为可重复的形式?然后,将其扩展到您可能如何遍历树以获得原始表达式..
  • 在 C 中,'*' 是一个整数。您可以将其存储在键中,但您需要一个结构成员来区分运算符和值。
  • 感谢 cmets 伙计们。这对我来说非常重要。是的,我知道这听起来像是家庭作业,但这不是家庭作业。我理解过程的主要问题 - “我如何添加一些不是数字的节点”。例如,如果我创建二叉树对我来说很简单,因为我只是比较我的数字并将它们添加到右侧或左侧节点(取决于一个值)。但是表达对我来说有些困难,因为我不知道当我向节点添加一些东西时它应该如何工作。
  • 你必须有两种类型的节点:一个操作符和一个操作数。运算符有两个孩子:left 和 right。操作数没有孩子。
  • 所以如果我们可以在主页面上看到,我会在树中添加一些数字,然后树会按照规则生成。但是我需要实现那个 make 表达式树的规则。所以我知道的一件事是数字是叶子,运算符是内部节点。但现在它对我没有帮助:)而且我觉得很愚蠢,因为我作为一个程序工作了 2 年多。但数学对我来说很难。我需要帮助。

标签: c binary-tree expression-trees


【解决方案1】:

表达式中的节点是以下两种情况之一:运算符或值。所以你需要划定。有几种方法可以做到这一点,但由于这是家庭作业,我倾向于稍微谨慎一点,让你使用迄今为止学到的编程概念来解决一些问题。

所以我决定通过展示如果您的节点正常工作,您的树可能会是什么样子来帮助您:

      +
     / \
    /   \
   /     \
  *       *
 / \     / \
5   -   6   4
   / \
  10  5

您可能想放弃“构建树”的概念,而将其视为“构建表达式”。这可能是阻碍你前进的原因。您最终可能会得到一些像这样使用的函数:

node *expr = subtract(value(10), value(5));

这构建了树的一部分。看看发生了什么? =)

【讨论】:

  • 非常感谢。是的,我不需要现成的解决方案。我将在目标 c 上为应用程序制作这个程序。但我选择了“C 语言”,因为它对很多人来说非常容易理解。所以,是的,现在我知道发生了什么。但是我无法理解为什么“+”运算符是树的根。是的,我看到树是正确的,我可以自己制作这个结构(我的意思是图形变体)。但我不知道如何在代码中做到这一点。所以第一个据我了解,我们需要获得单独的表达,例如6*4。我说的对吗?
  • 提示:value 函数的返回类型也是node*。至于您的问题,+ 节点位于顶部,因为在考虑使用运算符优先级的方程的“左”和“右”时,它最终出现在该位置。您是否必须实际解析字符串中的表达式并构建树,或者您只是对其进行硬编码?解析比较棘手,但无论哪种情况,你的树都应该是一样的。
  • 哦,对不起。我不添加此信息。是的,基于字符串“5*(10-5)+6*4”的表达式。我想我现在明白了它在硬代码变体中的样子。这对我来说也很重要,谢谢。
  • 好的,你已经完成了一半。我想你可以处理剩下的。解析时,基本上可以通过一次只查看一个标记、维护指向当前节点的指针并进行一些递归来动态构建表达式(如果遇到比调用者的优先级更高的运算符)操作员)。玩得开心! =)
  • 无论如何,谢谢。我想我没有这个主题的基本知识,因为这对我来说很难。树是一个非常抽象的东西:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
  • 2021-03-16
  • 1970-01-01
相关资源
最近更新 更多