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

已知含有n个结点的完全二叉树顺序存储,编算法传将爱完全二叉树对应的二叉树链表结构的树。

发布网友 发布时间:2022-05-04 12:06

我来回答

2个回答

热心网友 时间:2023-10-22 14:06

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1000
typedef struct
{
char data[MaxSize];
int n;
}SqBTree;

typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;

BTNode *trans(SqBTree a,int i)
{
BTNode *b;

if(i>a.n)
return NULL;
if(a.data[i-1]=='#')
return NULL;

b=(BTNode*)malloc(sizeof(BTNode));
b->data=a.data[i-1];
b->lchild=trans(a,2*i);
b->rchild=trans(a,2*i+1);
return b;
}

void dispBTNode(BTNode *b)
{
if(b!=NULL)
{
printf("%c",b->data);
if(b->lchild!=NULL||b->rchild!=NULL)
{
printf("(");
dispBTNode(b->lchild);
if(b->rchild!=NULL)
printf(",");
dispBTNode(b->rchild);
printf(")");
}
}
}

int main()
{
SqBTree a;
BTNode *b;
printf("请输入二叉树顺序存储结构的字符串(空节点用#表示):");
gets(a.data);
printf("\n\n请输入节点总个数n: ");
scanf("%d",&a.n);
b=trans(a,1);
printf("\n\n对应的二叉树链表结构字符串为:");
dispBTNode(b);
system("pause");
}

热心网友 时间:2023-10-22 14:06

前几天写的,输入二叉树的广义表形式,建立二叉树的链式存储。输出的是中序。有注释。例如输入:a(b,c(d,e(f)),g,h(i))
#include<stdio.h>
#include<stdlib.h>
int n=0; //全局变量
struct tree //二叉树结构体
{
char data;
struct tree *lc;
struct tree *rc;
};
tree *creat(char a[]) //创建树的二叉树
{
tree *h;
h=(tree *)malloc(sizeof(tree));
h->lc=NULL;
h->rc=NULL;
if(a[n]!=')'&&a[n]!='('&&a[n]!=',') //当a[n]为字母存入a[]
{
h->data=a[n];
n++;
}
if(a[n]=='(') //a[n]为左括弧对h->lc递归操作
{
n++;
h->lc=creat(a);
}
if(a[n]==',') //a[n]为逗号对h->rc递归操作
{
n++;
h->rc=creat(a);
return h;
}
if(a[n]==')') //a[n]为右括弧返回h
{
n++;
return h;
}
else
return h;

}
void print(tree *h) //二叉树中序输出
{
if(h!=NULL)
{
print(h->lc);
printf("%c",h->data);
print(h->rc);
}

}

int high(char a[]) //判断树的高度
{
int i=0,max=0,p=0;
while(a[i]!=0)
{
if(a[i]=='(')
{
p++;
if(max<i)
max=p;
}
if(a[i]==')')
p--;
i++;
}
if(p!=0)
{
printf("左右括弧数不等,输入错误\n"); //判断左右括弧数是否相等
exit(1);
}
return max+1;
}
void main() //主函数
{
int i=0;
tree *h;
char a[50]={0};
gets(a);
while(a[i]!=0) //判断各种可能出现的输入错误
{

if(i==0&&(a[i]=='('||a[i]==')'||a[i]==',')) //判断数组首元素是否为字母
{
printf("首节点错误\n");
exit(1);
}
if(a[i]=='(') //左括弧之前一定是字母
{
if(a[i-1]=='('||a[i-1]==')'||a[i-1]==',')
{
printf("输入错误\n");
exit(1);
}
}
if(a[i]!='('&&a[i]!=')'&&a[i]!=',') //两个字母不能在一起
{
if(a[i+1]!='('&&a[i+1]!=')'&&a[i+1]!=',')
{
printf("输入错误,两个字母不能在一起\n");
exit(1);
}
}
i++;
}
h=creat(a); //创建树
printf("该树的高度为:%d\n",high(a));
printf("该二叉树的中序输出为:");
print(h);
printf("\n");
}

热心网友 时间:2023-10-22 14:06

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1000
typedef struct
{
char data[MaxSize];
int n;
}SqBTree;

typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;

BTNode *trans(SqBTree a,int i)
{
BTNode *b;

if(i>a.n)
return NULL;
if(a.data[i-1]=='#')
return NULL;

b=(BTNode*)malloc(sizeof(BTNode));
b->data=a.data[i-1];
b->lchild=trans(a,2*i);
b->rchild=trans(a,2*i+1);
return b;
}

void dispBTNode(BTNode *b)
{
if(b!=NULL)
{
printf("%c",b->data);
if(b->lchild!=NULL||b->rchild!=NULL)
{
printf("(");
dispBTNode(b->lchild);
if(b->rchild!=NULL)
printf(",");
dispBTNode(b->rchild);
printf(")");
}
}
}

int main()
{
SqBTree a;
BTNode *b;
printf("请输入二叉树顺序存储结构的字符串(空节点用#表示):");
gets(a.data);
printf("\n\n请输入节点总个数n: ");
scanf("%d",&a.n);
b=trans(a,1);
printf("\n\n对应的二叉树链表结构字符串为:");
dispBTNode(b);
system("pause");
}

热心网友 时间:2023-10-22 14:06

前几天写的,输入二叉树的广义表形式,建立二叉树的链式存储。输出的是中序。有注释。例如输入:a(b,c(d,e(f)),g,h(i))
#include<stdio.h>
#include<stdlib.h>
int n=0; //全局变量
struct tree //二叉树结构体
{
char data;
struct tree *lc;
struct tree *rc;
};
tree *creat(char a[]) //创建树的二叉树
{
tree *h;
h=(tree *)malloc(sizeof(tree));
h->lc=NULL;
h->rc=NULL;
if(a[n]!=')'&&a[n]!='('&&a[n]!=',') //当a[n]为字母存入a[]
{
h->data=a[n];
n++;
}
if(a[n]=='(') //a[n]为左括弧对h->lc递归操作
{
n++;
h->lc=creat(a);
}
if(a[n]==',') //a[n]为逗号对h->rc递归操作
{
n++;
h->rc=creat(a);
return h;
}
if(a[n]==')') //a[n]为右括弧返回h
{
n++;
return h;
}
else
return h;

}
void print(tree *h) //二叉树中序输出
{
if(h!=NULL)
{
print(h->lc);
printf("%c",h->data);
print(h->rc);
}

}

int high(char a[]) //判断树的高度
{
int i=0,max=0,p=0;
while(a[i]!=0)
{
if(a[i]=='(')
{
p++;
if(max<i)
max=p;
}
if(a[i]==')')
p--;
i++;
}
if(p!=0)
{
printf("左右括弧数不等,输入错误\n"); //判断左右括弧数是否相等
exit(1);
}
return max+1;
}
void main() //主函数
{
int i=0;
tree *h;
char a[50]={0};
gets(a);
while(a[i]!=0) //判断各种可能出现的输入错误
{

if(i==0&&(a[i]=='('||a[i]==')'||a[i]==',')) //判断数组首元素是否为字母
{
printf("首节点错误\n");
exit(1);
}
if(a[i]=='(') //左括弧之前一定是字母
{
if(a[i-1]=='('||a[i-1]==')'||a[i-1]==',')
{
printf("输入错误\n");
exit(1);
}
}
if(a[i]!='('&&a[i]!=')'&&a[i]!=',') //两个字母不能在一起
{
if(a[i+1]!='('&&a[i+1]!=')'&&a[i+1]!=',')
{
printf("输入错误,两个字母不能在一起\n");
exit(1);
}
}
i++;
}
h=creat(a); //创建树
printf("该树的高度为:%d\n",high(a));
printf("该二叉树的中序输出为:");
print(h);
printf("\n");
}

热心网友 时间:2023-10-22 14:06

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 1000
typedef struct
{
char data[MaxSize];
int n;
}SqBTree;

typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BTNode;

BTNode *trans(SqBTree a,int i)
{
BTNode *b;

if(i>a.n)
return NULL;
if(a.data[i-1]=='#')
return NULL;

b=(BTNode*)malloc(sizeof(BTNode));
b->data=a.data[i-1];
b->lchild=trans(a,2*i);
b->rchild=trans(a,2*i+1);
return b;
}

void dispBTNode(BTNode *b)
{
if(b!=NULL)
{
printf("%c",b->data);
if(b->lchild!=NULL||b->rchild!=NULL)
{
printf("(");
dispBTNode(b->lchild);
if(b->rchild!=NULL)
printf(",");
dispBTNode(b->rchild);
printf(")");
}
}
}

int main()
{
SqBTree a;
BTNode *b;
printf("请输入二叉树顺序存储结构的字符串(空节点用#表示):");
gets(a.data);
printf("\n\n请输入节点总个数n: ");
scanf("%d",&a.n);
b=trans(a,1);
printf("\n\n对应的二叉树链表结构字符串为:");
dispBTNode(b);
system("pause");
}

热心网友 时间:2023-10-22 14:06

前几天写的,输入二叉树的广义表形式,建立二叉树的链式存储。输出的是中序。有注释。例如输入:a(b,c(d,e(f)),g,h(i))
#include<stdio.h>
#include<stdlib.h>
int n=0; //全局变量
struct tree //二叉树结构体
{
char data;
struct tree *lc;
struct tree *rc;
};
tree *creat(char a[]) //创建树的二叉树
{
tree *h;
h=(tree *)malloc(sizeof(tree));
h->lc=NULL;
h->rc=NULL;
if(a[n]!=')'&&a[n]!='('&&a[n]!=',') //当a[n]为字母存入a[]
{
h->data=a[n];
n++;
}
if(a[n]=='(') //a[n]为左括弧对h->lc递归操作
{
n++;
h->lc=creat(a);
}
if(a[n]==',') //a[n]为逗号对h->rc递归操作
{
n++;
h->rc=creat(a);
return h;
}
if(a[n]==')') //a[n]为右括弧返回h
{
n++;
return h;
}
else
return h;

}
void print(tree *h) //二叉树中序输出
{
if(h!=NULL)
{
print(h->lc);
printf("%c",h->data);
print(h->rc);
}

}

int high(char a[]) //判断树的高度
{
int i=0,max=0,p=0;
while(a[i]!=0)
{
if(a[i]=='(')
{
p++;
if(max<i)
max=p;
}
if(a[i]==')')
p--;
i++;
}
if(p!=0)
{
printf("左右括弧数不等,输入错误\n"); //判断左右括弧数是否相等
exit(1);
}
return max+1;
}
void main() //主函数
{
int i=0;
tree *h;
char a[50]={0};
gets(a);
while(a[i]!=0) //判断各种可能出现的输入错误
{

if(i==0&&(a[i]=='('||a[i]==')'||a[i]==',')) //判断数组首元素是否为字母
{
printf("首节点错误\n");
exit(1);
}
if(a[i]=='(') //左括弧之前一定是字母
{
if(a[i-1]=='('||a[i-1]==')'||a[i-1]==',')
{
printf("输入错误\n");
exit(1);
}
}
if(a[i]!='('&&a[i]!=')'&&a[i]!=',') //两个字母不能在一起
{
if(a[i+1]!='('&&a[i+1]!=')'&&a[i+1]!=',')
{
printf("输入错误,两个字母不能在一起\n");
exit(1);
}
}
i++;
}
h=creat(a); //创建树
printf("该树的高度为:%d\n",high(a));
printf("该二叉树的中序输出为:");
print(h);
printf("\n");
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
霍香烧烤要用什么调料? 重庆红油抄手的口感特点有哪些? dock其他系统 Ubuntu 20.04 桌面美化 Cairo Dock简介 我是四川省文科生,高一本线3分,报四川农业大学有戏不? 内存卡在电脑上格式化以后为什么车载影音导航扫描不到音乐文件夹了 别克凯越的原装导航SD卡格式化了怎么处理 起亚智跑2.4顶配原装车载导航里面的SD卡被我不小心格式化了,导致车载... SHE什么时候出道的,她们一共发了多少张专集 按照第4棵杨树,3棵梧桐树顺序载,第44棵载什么树,49棵呢? 吃鸡战场。白色吉利服在哪里? 小学三年级科学上册练习题观察树木顺序是由什么到什么? 绝地求生全白色咋办呀… 宝骏510倒车镜怎么拆卸,宝骏510倒车镜更换步骤 绝地求生白名单申请资格 纺锤树多少画 树提的笔画字有那些? 吃鸡在大厅是白色进去为啥是黑的 “秋、树、片、会”字的笔顺和田字格写法分别是什么? win10系统 七彩虹1660ti显卡 玩吃鸡屏幕发白 是什么问题 怎么解决 求大神指点 大树的树笔画顺序 绝地求生画面成白色 黄精100克,当归100克,熟地100克,丹参100克,枸杞500克,请问这副药的功效 我台式电脑换了了新主板跟cpu,又重装了系统。但玩吃鸡白天偶尔会重启,晚上玩就不会。这是怎么回? 人血白蛋白是吃鸡蛋白还是蛋黄 树笔画顺序怎么写 吃鸡白天如何去掉烟花声? 吃鸡白色洛丽塔裙子怎么获得 cash来源 “俊”字能组成哪些词? 电磁阀常闭型的通电几分钟空气开关就跳闸 宝骏510怎样换机油? 俊字的组词有哪些? 黄精和熟地一块泡茶喝,可以吗? ·俊组词有哪些 暗黑2冰法师技能树顺序 俊字组词 “俊”的组词有哪些? 俊的形近字 星际争霸1 人族 神族 虫族 各建筑建科技树顺序~ 带有&quot;俊&quot;字的男明星 百度有钱花返宝宝app双11真有优惠劵发放吗? 俊四字组词有哪些 为什么百度有钱花满易贷我领券的时候提示“券已发完”,朋友在我后面领的,却领到了? 有哪些带有“俊”字的诗句? 俊字有多少画 小程序开店怎么样? “俊”字有多少笔画? 天天有钱花邀请红包怎么领