我正在尝试创建这样的二叉树: link
输入将由用户输入为前缀并作为字符串读取,然后放入二叉树中。
这是我到目前为止:
struct node{ char val; struct node *left; struct node *right; }; typedef struct node root; typedef root *tree;
主要:
void main(){ int i; tree tr; char* s; s=input(); //input function tr=create_empty_tree(); for(i=0;s[i]!=' ';i++){ tr=add_root(s[i],ab); } convert_infix(tr); }
这是我几天来一直在努力的部分; 我似乎无法正确构建树。 这是我到目前为止:
tree add_root(char val, tree tr){ if ( tr == NULL ){ tr= create_root(val); } else{ if(val=="*" || val=="+" || val=="-" || val=="/"){ tr->left= add_root(val, tr->left); } else{ if(tr->left == NULL){ tr->left= add_root(val, tr->left); } else{ tr->right= add_root(val, tr->right); } } } return tr; }
我在网上看了这个,我知道我的function是错的,我试过这样做:
但我不知道如何回溯。 我已经好几天了,我疯了; 我只是编程的初学者所以请不要评判。
你有一个问题,一个字符串不是字符串char*
所以你不能做一些事情,比如在char
和char *
之间进行比较char *
…… ''
用于char,当""
用于c字符串即char *
所以替换这个:
if(val=="*" || val=="+" || val=="-" || val=="/")
通过以下代码
if(val=='*' || val=='+' || val=='-' || val=='/')
简单示例(简化了错误检查)
#include #include #include #include struct node{ char op; int val; struct node *left; struct node *right; }; typedef struct node Tree; char *get_token(char **p){ while(**p && isspace(**p)){//skip spaces ++*p; } char *ret = *p; if(!*ret){//empty return NULL; } while(**p && !isspace(**p)){ ++*p; } if(!**p){ **p = 0; ++*p; } return ret; } Tree *make_tree(char **p){ char *token = get_token(p); if(token){ Tree *tree = malloc(sizeof(*tree)); switch(*token){//token[1] == ' ' ?? case '*': case '/': case '+': case '-': tree->op = *token; tree->val = 0; tree->left = make_tree(p); tree->right = make_tree(p); break; default: tree->op = 'N'; tree->val = atoi(token); tree->left = tree->right = NULL; } return tree; } return NULL; } void release(Tree *tree){ if(tree){ release(tree->left); release(tree->right); free(tree); } } void print_infix(Tree *tree){ if(tree){ switch(tree->op){ case '*': case '/': case '+': case '-': putchar('(');print_infix(tree->left);printf(" %c ", tree->op);print_infix(tree->right);putchar(')'); break; case 'N': printf("%d", tree->val); break; default: fprintf(stderr, "nerror!n");//this should never be executed } } } int main(void){ char line[256]; while(fgets(line, sizeof(line), stdin)){ char *s = line; Tree *tree = make_tree(&s); print_infix(tree); putchar('n'); release(tree); } return 0; } #if 0 * + 7 3 - 5 2 ((7 + 3) * (5 - 2)) * 3 + 1 2 (3 * (1 + 2)) / + 1 + 2 3 5 ((1 + (2 + 3)) / 5) ^Z #endif
以上就是c/c++开发分享从c中的前缀表达式构建解析树相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/522961.html