typedef struct node{
char data;
struct node *lchild,*rchild;
}BinTNode,*BinTree; //自定义二叉树的结点类型
int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数
//基于先序遍历算法创建二叉树
//要求输入先序序列,其中加入虚结点"#"以示空指针的位置
BinTree CreatBinTree()
{
BinTree T;
char ch;
if((ch=getchar())=='#')
return(NULL); //读入#,返回空指针
else{
T=(BinTNode *)malloc(sizeof(BinTNode)); //生成结点
T->data=ch;
T->lchild=CreatBinTree(); //构造左子树
T->rchild=CreatBinTree(); //构造右子树
return(T);
}
}
//DLR 先序遍历
void Preorder(BinTree T)
{
if(T) { //T非空
printf("%c",T->data); //访问结点
Preorder(T->lchild); //先序遍历左子树
Preorder(T->rchild); //先序遍历右子树
}
}
//LDR 中序遍历
void Inorder(BinTree T)
{
if(T){
Inorder(T->lchild);
printf("%c",T->data);
Inorder(T->rchild);
}
}
//LRD 后序遍历
void Postorder(BinTree T)
{
if(T){
Postorder(T->lchild);
Postorder(T->rchild);
printf("%c",T->data);
}
}
//采用后序遍历求二叉树的深度、结点数及叶子数的递归算法
int TreeDepth(BinTree T)
{
int hl,hr,max;
if(T){
hl=TreeDepth(T->lchild); //求左深度
hr=TreeDepth(T->rchild); //求右深度
max=hl>hr? hl:hr; //取左右深度的最大值
NodeNum=NodeNum+1; //求结点数
if(hl==0&&hr==0) leaf=leaf+1; //若左右深度为0,即为叶子。
return(max+1);
}
else return(0);
}
//利用队列,按层次遍历二叉树
void Levelorder(BinTree T)
{
int front=0,rear=1;
BinTNode *cq[Max],*p; //定义结点的指针数组cq
cq[1]=T; //根入队
while(front!=rear)
{
front=(front+1)%NodeNum;
p=cq[front]; //出队
printf("%c",p->data); //出队,输出结点的值
if(p->lchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->lchild; //左子树入队
}
if(p->rchild!=NULL){
rear=(rear+1)%NodeNum;
cq[rear]=p->rchild; //右子树入队
}
}
}
bool Copy_Tree(BinTree T,BinTree &S)
{
if (T == NULL) S = NULL;
else
{
S = (BinTree)malloc(sizeof(BinTNode));
if (!S) exit(ERROR);
S->data=T->data;
Copy_Tree(T->lchild,S->lchild);
Copy_Tree(T->rchild,S->rchild);
}
return 0;
}
void A(){printf(".");}
void yemianzairu()
{
for(int i=1;i<=3;i++)
{
system("cls");printf("\n\n\n\n\n\n\n\n\n 页面载入中");
Sleep(100);
A();
Sleep(500);
A();
Sleep(500);
A();
Sleep(500);
A();
}
printf("\n");
system("cls");
}
//主函数
void main()
{
yemianzairu();
system("color F4");
BinTree root,S;
int i,depth,depth_S;
printf("输入二叉树(满二叉树):");//输入完全二叉树的先序序列,
// 用#代表虚结点,如ABD###CE##F##
root=CreatBinTree(); //创建二叉树,返回根结点
printf("\t**********选择功能 ************\n");
printf("\t1: 显示先序遍历的结果\n");
printf("\t2: 显示中序遍历的结果\n");
printf("\t3: 显示后序遍历的结果\n");
printf("\t4: 求二叉树的深度、结点数及叶子数\n");
printf("\t5: 显示层序遍历的结果\n"); //按层次遍历之前,先选择4,求出该树的结点数。
printf("\t6: 复制二叉树;\n");
printf("\t0: 退出\n");
printf("\t*******************************\n");
do { //从菜单中选择遍历方式,输入序号。
printf("请输入你的选择:");
scanf("%d",&i); //输入菜单序号(0-5)
switch (i){
case 1: printf("先序遍历的结果: ");
Preorder(root); //先序遍历
break;
case 2: printf("中序遍历的结果: ");
Inorder(root); //中序遍历
break;
case 3: printf("后序遍历的结果: ");
Postorder(root); //后序遍历
break;
case 4: depth=TreeDepth(root); //求树的深度及叶子数
printf("二叉树的深度=%d;结点数=%d;叶子数=%d",depth,NodeNum,leaf);
break;
case 5: printf("层序遍历的结果: ");
Levelorder(root); //按层次遍历
break;
case 6:Copy_Tree(root,S);printf("二叉树复制成功!新的二叉树命名为S;\n");
printf("S的先序遍历的结果: ");Preorder(S);printf("\n");
printf("S的中序遍历的结果: ");Inorder(root);printf("\n");
printf("S的后序遍历的结果: ");Postorder(root);
break;
default: exit(1);
}
printf("\n");
} while(i!=0);
free(S);free(root); //释放申请的内存;
}
二叉树的实现
最新推荐文章于 2022-07-04 20:36:06 发布