#include <stdio.h> #include <stdlib.h> typedef struct tree{ char data; struct tree *left,*right; }tree; struct tree* creat(tree *T,char *p){ T=malloc(sizeof(struct tree)); T->data=*p; printf("%c",*p); if(T->data=='#'){ T=NULL; } else{ // printf("%c",T->data); creat(T->left,p++); creat(T->right,p++); } return T; } int main(void){ char str[80]; while(scanf("%s",str)!=EOF){ char *p=str; tree *T=NULL; T=creat(T,p); } return 0; }
时间: 2024-04-02 13:32:28 浏览: 62
这段代码是一个用于构建二叉树的程序,它通过输入一串字符来创建一个二叉树。具体来说,输入的字符中包含 '#' 表示当前节点为空,其他字符表示当前节点的数据。程序通过递归的方式,先创建该节点,然后递归创建其左右子树,最终返回该节点。每次递归时,指针 p 指向输入字符的下一个字符,这样就可以逐个读取字符并构建二叉树。最终,程序返回整个二叉树的根节点。
相关问题
#include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <math.h> #define TRUE 1 #define FALSE 0 // 表达式树结点结构体 typedef struct _etNode{ char data; // 结点数据:操作符或操作数 struct _etNode* left; // 左子树指针 struct _etNode* right; // 右子树指针 }ET
Node;
// 定义栈结构体
typedef struct _stack{
int top; // 栈顶指针
int size; // 栈的大小
ETNode** data; // 栈的数据
}Stack;
// 创建栈
Stack* createStack(int size){
Stack* s = (Stack*)malloc(sizeof(Stack));
s->top = -1;
s->size = size;
s->data = (ETNode**)malloc(sizeof(ETNode*)*size);
return s;
}
// 判断栈为空
int isEmptyStack(Stack* s){
return s->top == -1;
}
// 判断栈是否已满
int isFullStack(Stack* s){
return s->top == s->size-1;
}
// 入栈
void pushStack(Stack* s, ETNode* e){
if(isFullStack(s)){
printf("Stack is full!\n");
return;
}
s->data[++s->top] = e;
}
// 出栈
ETNode* popStack(Stack* s){
if(isEmptyStack(s)){
printf("Stack is empty!\n");
return NULL;
}
return s->data[s->top--];
}
// 获取栈顶元素
ETNode* getTopStack(Stack* s){
if(isEmptyStack(s)){
printf("Stack is empty!\n");
return NULL;
}
return s->data[s->top];
}
// 判断字符是否为操作符
int isOperator(char c){
switch(c){
case '+':
case '-':
case '*':
case '/':
case '^':
return TRUE;
default:
return FALSE;
}
}
// 创建表达式树
ETNode* createET(char* expr){
Stack* s = createStack(strlen(expr));
int i;
for(i=0; expr[i]!='\0'; i++){
if(isdigit(expr[i])){
// 如果是数字,则创建一个叶子结点
ETNode* node = (ETNode*)malloc(sizeof(ETNode));
node->data = expr[i];
node->left = NULL;
node->right = NULL;
pushStack(s, node);
}
else if(isOperator(expr[i])){
// 如果是操作符,则创建一个新的结点,并将栈顶的两个结点作为它的左右孩子
ETNode* node = (ETNode*)malloc(sizeof(ETNode));
node->data = expr[i];
node->right = popStack(s);
node->left = popStack(s);
pushStack(s, node);
}
else{
// 如果是无效字符,则忽略
continue;
}
}
return popStack(s);
}
// 计算表达式树的值
double calculateET(ETNode* root){
if(root == NULL){
return 0;
}
if(root->left == NULL && root->right == NULL){
// 如果是叶子结点,则返回它的值
return atof(&root->data);
}
double leftValue = calculateET(root->left);
double rightValue = calculateET(root->right);
switch(root->data){
case '+':
return leftValue + rightValue;
case '-':
return leftValue - rightValue;
case '*':
return leftValue * rightValue;
case '/':
return leftValue / rightValue;
case '^':
return pow(leftValue, rightValue);
default:
return 0;
}
}
int main(){
char expr[100];
printf("请输入中缀表达式:");
gets(expr);
ETNode* root = createET(expr);
printf("表达式树创建成功!\n");
printf("表达式的计算结果为:%lf\n", calculateET(root));
return 0;
}
#include <stdio.h> #include <stdlib.h> #include <string.h> int i=0; typedef struct tree{ char data; struct tree *left,*right; }tree; struct tree* creat(char str[],tree *root){ root=malloc(sizeof(tree)); root->data=str[i]; printf("%c",str[i]); i++; if(root->data=='#'){ root=NULL; } else{ creat(str,root->left); creat(str,root->right); } return root; } int main(void){ char str[80]; while(scanf("%s",&str)!=EOF){ tree *T=NULL; T=creat(str,T); } return 0; }输出超时错误的原因
这个代码的核心是递归创建二叉树,但是输入格式存在问题,导致程序无法正常运行。scanf("%s",&str) 会读入一个字符串,但是没有指定字符串的长度,如果输入的字符串过长,就会导致数组越界,甚至可能导致程序崩溃。
另外,题目中没有给出输入数据的具体格式,如果每行只有一个字符串,那么 while 循环可能会一直运行下去,直到输入结束,导致超时错误。在处理输入时,应该根据具体情况进行适当的判断和处理。
阅读全文