1、按中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,分别求其高度、总结点数目、单分支结点数目、叶结点数目。
//
// Created by CHAO on 2021-11-29.
//
// 设计并验证如下算法:按中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,
// 分别求其高度、总结点数目、单分支结点数目、叶结点数目。
#include "stdio.h"
#include "stdlib.h"
typedef char Elemtype;
static int flag=0;
typedef struct node{
char data;
struct node *lchild; //左子树
struct node *rchild; //右子树
}Bitnode,*Bitree;
//二叉树声明
void BuildBitree( Bitree *T){ //创建二叉树
char c;
scanf("%c",&c);
if(c=='#')
*T=NULL;
else
{
*T=(Bitree) malloc(sizeof (Bitnode));
BuildBitree(&(*T)->lchild); //创建左子树
(*T)->data=c; //创建根节点
BuildBitree(&(*T)->rchild); //创建右子树
}
}
void visit(char c,int level){ //访问二叉树
printf("内容为%c,在第%d层\n",c,level);
}
void TravelseBitree(Bitree T,int level){ //遍历二叉树
if(T){
visit(T->data,level);
TravelseBitree(T->lchild,level+1);
TravelseBitree(T->rchild,level+1);
//先序遍历二叉树
}
}
void EqualBitree(Bitree A,Bitree B){ //判断两颗二叉树是否相等
if(A==NULL&&B==NULL) //AB都为空
return;
if((A!=NULL&&B==NULL)||(B!=NULL&&A==NULL)||(A->data!=B->data))
{ //数值不相同,结构不同
flag++;
return;
}
EqualBitree(A->lchild,B->lchild);
EqualBitree(A->rchild,B->rchild);
}
int AddNode(Bitree T){ //求总结点数
if(T==NULL)
return 0;
else
return 1+ AddNode(T->lchild)+ AddNode(T->rchild);
}
int AloneNode(Bitree T){ //求单节点数
if(T==NULL) //空树
return 0; //
else if((T->lchild!=NULL&&T->rchild==NULL)||(T->lchild==NULL&&T->rchild!=NULL))
return 1+ AloneNode(T->lchild)+ AloneNode(T->rchild);
else if(T->lchild!=NULL&&T->rchild!=NULL)
return AloneNode(T->lchild)+ AloneNode(T->rchild);
}
int LeafNode(Bitree T){ //求叶子结点数
if(T==NULL) //空树
return 0;
else if(T->lchild==NULL&&T->rchild==NULL) //叶子结点
return 1;
else
return LeafNode(T->lchild)+ LeafNode(T->rchild);
}
int TreeDeep(Bitree T){
int num1=0,num2=0;
if(T==NULL)
return 0;
else
{
num1=1+TreeDeep(T->lchild);
num2=1+TreeDeep(T->rchild);
}
return num1>num2?num1:num2;
}
int main(){
int level=1;
int le=1;
Bitree A=NULL;
Bitree B=NULL;
printf("请输入数据建立二叉树A\n");
BuildBitree(&A);
getchar();
printf("请输入数据建立二叉树B\n");
BuildBitree(&B);
getchar();
TravelseBitree(A,level); //遍历二叉树
// TravelseBitree(B,le);
EqualBitree(A,B); //是否相等
if(flag==0)
printf("两棵树相同\n");
else
printf("两棵树不相同\n");
printf("叶子结点数目为%d\n", LeafNode(A));
printf("总结点数为%d\n", AddNode(A));
printf("单节点数目为%d\n", AloneNode(A));
printf("深度为%d", TreeDeep(A));
return 0;
}
1.输入二叉树的数据时按照先序的输入方式进行输入, 程序会用中序的方法来创建二叉树,注意若结点没有子树,需要用‘#’来代替,提供一种输入:
AB#D##CE###
2.输入完第一棵树后需要输入第二颗树的数据,与输入第一颗时相同。
3.输入完成后程序会判断两棵树是否相等,相等时在数据以及结构上都相等,然后会输出树的各项指标,这里就没有输出两棵树的了,只输出了一棵树的各项指标,全输出显得有些赘余。