#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef char ElemType; typedef struct BitNode { ElemType data[10]; struct BitNode *lchild, *rchild; } BitNode, *BiTree; void CreateBiTree(BiTree *t) { char ch[10]; scanf("%s", ch); if(ch[0] == '#') { *t = NULL; } else { *t = (BitNode*) malloc(sizeof(BitNode)); strcpy((*t)->data, ch); CreateBiTree(&((*t)->lchild)); CreateBiTree(&((*t)->rchild)); } } void InOrderTraverse(BiTree t) { if(t) { char* op = t->data; if(!isdigit(op[0])) printf("("); InOrderTraverse(t->lchild); printf("%s", t->data); InOrderTraverse(t->rchild); if(!isdigit(op[0])) printf(")"); } } int main() { BiTree tree = NULL; char ch[10]; while(scanf("%s", ch) != EOF) { tree = (BitNode*) malloc(sizeof(BitNode)); strcpy(tree->data, ch); CreateBiTree(&(tree->lchild)); CreateBiTree(&(tree->rchild)); InOrderTraverse(tree); printf("\n"); free(tree); } return 0; }
时间: 2024-03-19 10:41:05 浏览: 16
这段代码是关于二叉树的创建和遍历的。具体来说,它实现了以下几个功能:
1. 通过递归方式创建二叉树,其中 "#" 表示空节点;
2. 中序遍历二叉树,并在非数字节点的前后加上括号。
这样,通过输入一系列节点的值,就可以构建出一颗二叉树,并输出其中序遍历结果。但是需要注意的是,这段代码中没有对二叉树进行任何操作,只是简单地创建和遍历了一颗二叉树。
相关问题
#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 <ctype.h> #include <string.h> typedef struct TreeNode { char data; struct TreeNode* left; struct TreeNode* right; } TreeNode; TreeNode* createNode(char data) { TreeNode* node = (TreeNode*) malloc(sizeof(TreeNode)); node->data = data; node->left = NULL; node->right = NULL; return node; } TreeNode* createBinaryTree(char* expression, int start, int end) { if (start > end) { return NULL; } TreeNode* root = NULL; int i; int flag = 0; for (i = start; i <= end; i++) { if (expression[i] == '(') { flag++; } else if (expression[i] == ')') { flag--; } else if (flag == 0 && (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/')) { root = createNode(expression[i]); break; } } if (root == NULL) { for (i = start; i <= end; i++) { if (isdigit(expression[i])) { root = createNode(expression[i]); break; } } } root->left = createBinaryTree(expression, start, i - 1); root->right = createBinaryTree(expression, i + 1, end); return root; } int evaluate(TreeNode* root) { if (root == NULL) { return 0; } if (root->left == NULL && root->right == NULL) { return root->data - '0'; } int leftValue = evaluate(root->left); int rightValue = evaluate(root->right); switch (root->data) { case '+': return leftValue + rightValue; case '-': return leftValue - rightValue; case '*': return leftValue * rightValue; case '/': return leftValue / rightValue; default: return 0; } } int main() { char expression[100]; printf("请输入中序表达式:"); scanf("%s", expression); TreeNode* root = createBinaryTree(expression, 0, strlen(expression) - 1); int result = evaluate(root); printf("表达式的值为:%d\n", result); return 0; }给每一行加上详细注释,并说明使用了什么方法编写的代码,以及用这种方法的好处
这段代码使用了二叉树和递归的方法,实现了对中序表达式的求值。
注释如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
// 定义二叉树结点
typedef struct TreeNode {
char data; // 结点数据
struct TreeNode* left; // 左子树
struct TreeNode* right; // 右子树
} TreeNode;
// 创建二叉树结点
TreeNode* createNode(char data) {
TreeNode* node = (TreeNode*) malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
// 创建二叉树
TreeNode* createBinaryTree(char* expression, int start, int end) {
if (start > end) {
return NULL;
}
TreeNode* root = NULL;
int i;
int flag = 0; // 记录左右括号的数量差
// 寻找运算符
for (i = start; i <= end; i++) {
if (expression[i] == '(') {
flag++;
} else if (expression[i] == ')') {
flag--;
} else if (flag == 0 && (expression[i] == '+' || expression[i] == '-' || expression[i] == '*' || expression[i] == '/')) {
root = createNode(expression[i]);
break;
}
}
// 如果没有找到运算符,说明是数字,创建相应结点
if (root == NULL) {
for (i = start; i <= end; i++) {
if (isdigit(expression[i])) {
root = createNode(expression[i]);
break;
}
}
}
// 递归创建左右子树
root->left = createBinaryTree(expression, start, i - 1);
root->right = createBinaryTree(expression, i + 1, end);
return root;
}
// 计算二叉树表达式的值
int evaluate(TreeNode* root) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL) {
return root->data - '0';
}
int leftValue = evaluate(root->left);
int rightValue = evaluate(root->right);
// 根据运算符计算表达式的值
switch (root->data) {
case '+':
return leftValue + rightValue;
case '-':
return leftValue - rightValue;
case '*':
return leftValue * rightValue;
case '/':
return leftValue / rightValue;
default:
return 0;
}
}
int main() {
char expression[100];
printf("请输入中序表达式:");
scanf("%s", expression);
TreeNode* root = createBinaryTree(expression, 0, strlen(expression) - 1);
int result = evaluate(root);
printf("表达式的值为:%d\n", result);
return 0;
}
```
使用二叉树和递归的方法,可以将中序表达式转化为二叉树,并通过递归遍历二叉树求出表达式的值。这种方法的好处是简单易懂,代码实现简单,易于调试和修改。同时,对于复杂的表达式,使用二叉树和递归的方法也能够高效地求出表达式的值。