自考数据结构上机题目3 二叉树.docx
- 文档编号:6141830
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:8
- 大小:15.32KB
自考数据结构上机题目3 二叉树.docx
《自考数据结构上机题目3 二叉树.docx》由会员分享,可在线阅读,更多相关《自考数据结构上机题目3 二叉树.docx(8页珍藏版)》请在冰豆网上搜索。
自考数据结构上机题目3二叉树
/*二叉树*/
#include
#include
#include
#definesize100
typedefcharDataType;
typedefstructnode
{
DataTypedata;
structnode*lchild,*rchild;//左右孩子指针
}BinTNode;//结点类型
typedefBinTNode*BinTree;
//建立二叉树
voidCreateBinTree(BinTree*T)
{
charch;
if((ch=getchar())=='')
{
printf("建立空节点\n");
*T=NULL;
}
else
{
*T=(BinTNode*)malloc(sizeof(BinTNode));
(*T)->data=ch;
printf("建立节点%c\n",ch);
CreateBinTree(&(*T)->lchild);
CreateBinTree(&(*T)->rchild);
}
}
//在序列中查找节点位置
intSearch(chararray[],charc)
{
inti=0;
while(array[i]!
=c&&array[i])
{
i++;
}
if(array[i]==c)
{
returni;
}
else
{
return-1;
}
}
//基于先序和中序序列的构造算法
voidCreateBinTree2(BinTree*T,charpre[],charino[],intps,intis,intn)
{
intk;
if(n==0)
{
*T=NULL;
}
else
{
k=Search(ino,pre[ps]);
if(k==-1)
{
puts("Error\n");
}
else
{
*T=(BinTNode*)malloc(sizeof(BinTNode));
(*T)->data=pre[ps];
if(k==is)
{
(*T)->lchild=NULL;
}
else
{
CreateBinTree2(&(*T)->lchild,pre,ino,ps+1,is,k-is);
}
if(k==is+n-1)
{
(*T)->rchild=NULL;
}
else
{
CreateBinTree2(&(*T)->rchild,pre,ino,ps+1+(k-is),k+1,n-(k-is)-1);
}
}
}
}
//基于中序和后序序列的构造算法
voidCreateBinTree3(BinTree*T,charino[],charpost[],intis,intps,intn)
{
intk;
if(n==0)
{
*T=NULL;
}
else
{
k=Search(ino,post[ps+n-1]);
if(k==-1)
{
puts("Error!
\n");
}
else
{
*T=(BinTNode*)malloc(sizeof(BinTNode));
(*T)->data=post[ps+n-1];
if(k==is)
{
(*T)->lchild=NULL;
}
else
{
CreateBinTree3(&(*T)->lchild,ino,post,is,ps,k-is);
}
if(k==is+n-1)
{
(*T)->rchild=NULL;
}
else
{
CreateBinTree3(&(*T)->rchild,ino,post,k+1,ps+(k-is),n-(k-is)-1);
}
}
}
}
//先序遍历二叉树
voidPreorder(BinTreeT)
{
if(T)
{
printf("%c",T->data);
Preorder(T->lchild);
Preorder(T->rchild);
}
}
//中序遍历二叉树
voidInorder(BinTreeT)
{
if(T)
{
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
//后序遍历二叉树
voidPostOrder(BinTreeT)
{
if(T)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
//求二叉树的深度(高度)
intGetDepth(BinTreeT)
{
intld,rd;
if(!
T)
{
return0;
}
else
{
ld=GetDepth(T->lchild);
rd=GetDepth(T->rchild);
returnld>rd?
ld+1:
rd+1;
}
}
//求二叉树叶子节点数
intGetLeafCount(BinTreeT)
{
intcount;
if(T==NULL)
{
count=0;
}
elseif((T->lchild==NULL)&&(T->rchild==NULL))
{
count=1;
}
else
{
count=GetLeafCount(T->lchild)+GetLeafCount(T->rchild);
}
returncount;
}
//求度为1的节点个数
intGetOneDegreeLeaf(BinTreeT)
{
intcount;
if(T==NULL)
{
count=0;
}
elseif((T->lchild==NULL)&&(T->rchild!
=NULL))
{
count=1;
}
elseif((T->lchild!
=NULL)&&(T->rchild==NULL))
{
count=1;
}
else
{
count=GetOneDegreeLeaf(T->lchild)+GetOneDegreeLeaf(T->rchild);
}
returncount;
}
voidmain()
{
intdepth,leafCount,oneDegreeLeafCount;
charpre[20],ino[20],post[20];
BinTreeroot=NULL;
//puts("输入前序序列:
");
//gets(pre);
puts("输入中序序列:
");
gets(ino);
puts("输入后序序列:
");
gets(post);
//CreateBinTree(&root);
//CreateBinTree2(&root,pre,ino,0,0,6);
CreateBinTree3(&root,ino,post,0,0,11);
puts("\n前序遍历二叉树:
");
Preorder(root);
puts("\n中序遍历二叉树:
");
Inorder(root);
puts("\n后序遍历二叉树:
");
PostOrder(root);
depth=GetDepth(root);
printf("\n二叉树深度(高度)为:
%d",depth);
leafCount=GetLeafCount(root);
printf("\n二叉树叶节点为:
%d",leafCount);
oneDegreeLeafCount=GetOneDegreeLeaf(root);
printf("\n二叉树度为一的节点数为:
%d",oneDegreeLeafCount);
getch();
}
/*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 自考数据结构上机题目3 二叉树 自考 数据结构 上机 题目 二叉