【发布时间】: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