早教吧 育儿知识 作业答案 考试题库 百科 知识分享

建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。1)采用二叉链表存储结构建立二叉树,从键盘按先序输入二叉树的结点序列。如,建立如

题目详情
建立二叉树的二叉链表表示,实现二叉树的先序、中序、后序和按层次遍历,统计并输出结点个数。
1)采用二叉链表存储结构建立二叉树,从键盘按先序输入二叉树的结点序列。如,建立如右图所示的二叉树,建立时按先序输入的结点序列为: abc###de#f##g##,其中“#”表示空格字符,用来代表空树。
(2)二叉树的建立、先序遍历、中序遍历、后序遍历均采用递归方式实现。
(3)层序遍历采用非递归方式实现。
(4)利用后序遍历算法统计结点个数。
▼优质解答
答案和解析
typedef struct node
{
char data;
struct node *lchild,*rchild;
}bitree;
bitree *root=NULL;
//创建树
bitree *CreateTree(char *sInPut)
{
bitree *root,*s;
bitree *Q[128];
int front,rear;
root=NULL;
front=1;
rear=0;
char temp[128],*p;
memset(temp,0,128);
strcpy(temp,sInPut);
p=temp;
while(strlen(p)>0)
{
s=NULL;
if(*p!='@')
{
s=(bitree*)malloc(sizeof(bitree));
s->data=*p;
s->lchild=NULL;
s->rchild=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)
{
root=s;
}
else
{
if(s && Q[front])
{
if(rear%2==0)
Q[front]->lchild=s;
else
Q[front]->rchild=s;
}
if(rear%2==1) front++;
}
p+=2;
}
return root;
}
//释放树
void freetree(bitree *root)
{
if(root!=NULL)
{
freetree(root->lchild);
freetree(root->rchild);
free(root);
}
}
//前序遍历
void preorder(bitree *root)
{
if(root!=NULL)
{
printf("%c\t",root->data);
preorder(root->lchild,sOutPut);
preorder(root->rchild,sOutPut);
}
}
//中序遍历
void inorder(bitree *root)
{
if(root!=NULL)
{
inorder(root->lchild,sOutPut);
printf("%c\t",root->data);
inorder(root->rchild,sOutPut);
}
}
//后序遍历
void postorder(bitree *root)
{
if(root!=NULL)
{
postorder(root->lchild,sOutPut);
postorder(root->rchild,sOutPut);
printf("%c\t",root->data);
}
}
//层次遍历
void PrintTree(bitree *root)
{
CString sOutPut;
char temp[128];
bitree *Q[128],*s;
int front,rear;
front=0;
rear=0;
sOutPut.Empty();
Q[rear++]=root;
while(rear>front)
{
printf("%c\t",Q[front]->data);
sOutPut=temp;
s=Q[front++];
if(s->lchild!=NULL)
Q[rear++]=s->lchild;
if(s->rchild!=NULL)
Q[rear++]=s->rchild;
}
}
//树叶子数
void countleaf(bitree *root,int &count)
{ if(root!=NULL)
{ if((root->lchild==NULL)&&(root->rchild==NULL))
{ count++;
return;
}
countleaf(root->lchild,count);
countleaf(root->rchild,count);
}
}
//树深度
void treedepth(bitree *root,int l,int &h)
{ if(root!=NULL)
{ l=l+1;
if(l>h) h=l;
treedepth(root->lchild,l,h);
treedepth(root->rchild,l,h);
}
}
看了建立二叉树的二叉链表表示,实现...的网友还看了以下:

链式存储结构的存储密度小,反而空间利用率却比顺序存储结构的大?为什么?链式存储结构的存储密度小,顺  2020-05-16 …

用顺序存储结构存储的线性表称做顺序表,用链式存储结构存储的线性表称为 ______。  2020-05-23 …

顺序表查找为什么不是在顺序存储结构上进行查找顺序表查找指的是在顺序存储结构上进行查找这句话为什么是  2020-06-08 …

A、循环链表是循环队列的链式存储结构B、栈与队列都只能顺序存储C、循环队列是队列的顺序存储结构1、  2020-06-28 …

帮忙作一下数据结构的题填空题:循环单链表与非循环单链表的主要不同是.S(n)表示.在采用顺序存储结  2020-06-28 …

建立两个带头结点的有序单链表La、Lb(单调递增,结点的值域为整型数据),利用La、Lb的结点空间  2020-07-27 …

已知DNA一条链求另一条链和互补链的程序用C语言编写输入:一条字符串(由A、T、G、C构成)表式DN  2020-11-01 …

关于数据结构的题1.若在线性表中采用二分查找法查找元素,该线性表应该().A.元素按值有序B.采用顺  2020-12-05 …

排序(用链表实现,用c实现)将一个杂乱无序的整数序列,按照从小到大的顺序排列并输出。用第二章的相关知  2020-12-05 …

8.邻接表是图的一种().A.顺序存储结构B.链式存储结构C.索引存储结构D.散列存储结构8.邻接表  2021-01-22 …