问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

学了一个学期了,很多地方都不会,广义表是怎么回事啊?

发布网友 发布时间:2023-10-09 10:13

我来回答

1个回答

热心网友 时间:2024-12-12 10:09

这页的可以编译通过了:

#include <stdio.h>
#include <stdlib.h>
#define STACK_MAX_SIZE 30
#define QUEUE_MAX_SIZE 30
#ifndef elemType
typedef char elemType;
#endif
/************************************************************************/
/* 以下是关于二叉树操作的11个简单算法 */
/************************************************************************/
struct BTreeNode{
elemType data;
struct BTreeNode *left;
struct BTreeNode *right;
};

/* 1.初始化二叉树 */
void initBTree(struct BTreeNode* *bt)
{
*bt = NULL;
return;
}

/* 2.建立二叉树(根据a所指向的二叉树广义表字符串建立) */
void createBTree(struct BTreeNode* *bt, char *a)
{
struct BTreeNode *p;
struct BTreeNode *s[STACK_MAX_SIZE];/* 定义s数组为存储根结点指针的栈使用 */
int top = -1; /* 定义top作为s栈的栈顶指针,初值为-1,表示空栈 */
int k; /* 用k作为处理结点的左子树和右子树,k = 1处理左子树,k = 2处理右子树 */
int i = 0; /* 用i扫描数组a中存储的二叉树广义表字符串,初值为0 */
*bt = NULL; /* 把树根指针置为空,即从空树开始建立二叉树 */
/* 每循环一次处理一个字符,直到扫描到字符串结束符\0为止 */
while(a[i] != '\0'){
switch(a[i]){
case ' ':
break; /* 对空格不作任何处理 */
case '(':
if(top == STACK_MAX_SIZE - 1){
printf("栈空间太小!\n");
exit(1);
}
top++;
s[top] = p;
k = 1;
break;
case ')':
if(top == -1){
printf("二叉树广义表字符串错误!\n");
exit(1);
}
top--;
break;
case ',':
k = 2;
break;
default:
p = (struct BTreeNode *)malloc(sizeof(struct BTreeNode));
p->data = a[i];
p->left = p->right = NULL;
if(*bt == NULL){
*bt = p;
}else{
if( k == 1){
s[top]->left = p;
}else{
s[top]->right = p;
}
}
}
i++; /* 为扫描下一个字符修改i值 */
}
return;
}

/* 3.检查二叉树是否为空,为空则返回1,否则返回0 */
int emptyBTree(struct BTreeNode *bt)
{
if(bt == NULL){
return 1;
}else{
return 0;
}
}

/* 4.求二叉树深度 */
int BTreeDepth(struct BTreeNode *bt)
{
if(bt == NULL){
return 0; /* 对于空树,返回0结束递归 */
}else{
int dep1 = BTreeDepth(bt->left); /* 计算左子树的深度 */
int dep2 = BTreeDepth(bt->right); /* 计算右子树的深度 */
if(dep1 > dep2){
return dep1 + 1;
}else{
return dep2 + 1;
}
}
}

/* 5.从二叉树中查找值为x的结点,若存在则返回元素存储位置,否则返回空值 */
elemType *findBTree(struct BTreeNode *bt, elemType x)
{
if(bt == NULL){
return NULL;
}else{
if(bt->data == x){
return &(bt->data);
}else{ /* 分别向左右子树递归查找 */
elemType *p;
if(p = findBTree(bt->left, x)){
return p;
}
if(p = findBTree(bt->right, x)){
return p;
}
return NULL;
}
}
}

/* 6.输出二叉树(前序遍历) */
void printBTree(struct BTreeNode *bt)
{
/* 树为空时结束递归,否则执行如下操作 */
if(bt != NULL){
printf("%c", bt->data); /* 输出根结点的值 */
if(bt->left != NULL || bt->right != NULL){
printf("(");
printBTree(bt->left);
if(bt->right != NULL){
printf(",");
}
printBTree(bt->right);
printf(")");
}
}
return;
}

/* 7.清除二叉树,使之变为一棵空树 */
void clearBTree(struct BTreeNode* *bt)
{
if(*bt != NULL){
clearBTree(&((*bt)->left));
clearBTree(&((*bt)->right));
free(*bt);
*bt = NULL;
}
return;
}

/* 8.前序遍历 */
void preOrder(struct BTreeNode *bt)
{
if(bt != NULL){
printf("%c ", bt->data); /* 访问根结点 */
preOrder(bt->left); /* 前序遍历左子树 */
preOrder(bt->right); /* 前序遍历右子树 */
}
return;
}

/* 9.前序遍历 */
void inOrder(struct BTreeNode *bt)
{
if(bt != NULL){
inOrder(bt->left); /* 中序遍历左子树 */
printf("%c ", bt->data); /* 访问根结点 */
inOrder(bt->right); /* 中序遍历右子树 */
}
return;
}

/* 10.后序遍历 */
void postOrder(struct BTreeNode *bt)
{
if(bt != NULL){
postOrder(bt->left); /* 后序遍历左子树 */
postOrder(bt->right); /* 后序遍历右子树 */
printf("%c ", bt->data); /* 访问根结点 */
}
return;
}

/* 11.按层遍历 */
void levelOrder(struct BTreeNode *bt)
{
struct BTreeNode *p;
struct BTreeNode *q[QUEUE_MAX_SIZE];
int front = 0, rear = 0;
/* 将树根指针进队 */
if(bt != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = bt;
}
while(front != rear){ /* 队列非空 */
front = (front + 1) % QUEUE_MAX_SIZE; /* 使队首指针指向队首元素 */
p = q[front];
printf("%c ", p->data);
/* 若结点存在左孩子,则左孩子结点指针进队 */
if(p->left != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->left;
}
/* 若结点存在右孩子,则右孩子结点指针进队 */
if(p->right != NULL){
rear = (rear + 1) % QUEUE_MAX_SIZE;
q[rear] = p->right;
}
}
return;
}

/************************************************************************/

int main(int argc, char *argv[])
{
struct BTreeNode *bt; /* 指向二叉树根结点的指针 */
char *b; /* 用于存入二叉树广义表的字符串 */
elemType x, *px;
initBTree(&bt);
printf("输入二叉树广义表的字符串:\n");
/* scanf("%s", b); */
b = "a(b(c), d(e(f, g), h(, i)))";
createBTree(&bt, b);
if(bt != NULL)
printf(" %c ", bt->data);
printf("以广义表的形式输出:\n");
printBTree(bt); /* 以广义表的形式输出二叉树 */
printf("\n");
printf("前序:"); /* 前序遍历 */
preOrder(bt);
printf("\n");
printf("中序:"); /* 中序遍历 */
inOrder(bt);
printf("\n");
printf("后序:"); /* 后序遍历 */
postOrder(bt);
printf("\n");
printf("按层:"); /* 按层遍历 */
levelOrder(bt);
printf("\n");
/* 从二叉树中查找一个元素结点 */
printf("输入一个待查找的字符:\n");
scanf(" %c", &x); /* 格式串中的空格跳过空白字符 */
px = findBTree(bt, x);
if(px){
printf("查找成功:%c\n", *px);
}else{
printf("查找失败!\n");
}
printf("二叉树的深度为:");
printf("%d\n", BTreeDepth(bt));
clearBTree(&bt);
return 0;
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我这个配置能玩大唐无双2吗 PK什么的能卡么? 求高手解答 这样的配置还要加什么玩大唐无双才不卡 这个配置能玩大唐无双双开吗? windows7旗舰版系统玩大唐无双零双开卡怎么办?卡死了。 玩大唐无双的时候双开过地图太卡怎么解决啊 全民枪战我用QQ号,但它说密码数字英文,下划线组成,应该怎样弄啊?_百 ... 小太阳取暖器头晕呕吐 取暖器用的会头晕吗,可能的原因和使用注意事项 男孩姓孙含越字好名字 简单特别的男孩名字越 中间是越的男孩名字大全 仿写致橡树9 中学生使用手机是利大于弊,还是弊大于利 赵本山何时首次登上央视春晚?3 vivo x5sl 后置摄像头怎么拆? 请问广义表的这个递归是怎么回事? vlan1(内网) 不能访问外网,vlan2(外网)不能与内...3 中学生玩电子产品是利大于弊还是弊大于利? 被封了怎么解封? 距离春季还有103天,赵本山会出现在央视春季联欢晚会上吗? 如何写论文答辩ppt3 出国到底是利大于弊,还是弊大于利 二叉树先序非递归遍历C语言算法10 怎么样做俯卧撑才能练胸肌?3944 漯河到郑州的火车票班次与价格18 经常坐飞机应该如何省钱 论文答辩ppt内容怎么写1 二叉树采用链表存储结构,实现建立、遍历(先序、中序、后序)、... 一棵树的广义表表示为a(b,c(e,f(g)),d),当用左...17 内网的核心交换机上已划分了2个VLAN,现要求与外网连接,需...1 吃药真的能快速长高吗 有效吗442 工作原因需要长期每周时末往返广深两地,有没有可以省钱又便捷的... 大学里可以喝酒的吗?1 仿写诗歌《致橡树》83 vivox5sl摄像头可以旋转吗 将电脑中的照片放到数码相机里需要安装什么软件?2 赵本山参加春节联欢晚会多少年了5 舒婷诗歌《致橡树》的仿写作品96 关于中学生使用手机弊大于利的攻辩提问。越多越好,谢谢。 编写一个C++程序,先生成再层次遍历一个二叉树18 坐飞机怎么样才能打折啊?8 vivox5sl换个摄像头要多少钱 春晚赵本山会上吗3 大学生可不可以禁止喝酒呢1 Pascal 二叉树的问题15 怎样把电脑里的照片传到数码相机里面7 仿写舒婷《致橡树》诗句“我如果我爱你,绝不……”。18 今年春节晚会 赵本山上吗8 学生带手机进学校,辩论赛,我是利大于弊,越详细越好! 毕业论文答辩的PPT应该包含哪些内容?2569 怎么把电脑里的照片传到相机里9