(一)问题描述
1.求二叉树的层次(高度)
2.求二叉树的叶子个数
3.求二叉树的总结点个数
4.求二叉树的度为1的结点个数
5.求二叉树的度为2的结点个数
6.复制二叉树
7.交换二叉树的左右子树
8.利用先序和中序序列建立二叉链表存储的二叉树
9.判定二叉树是否为完全二叉树
10.判定两棵二叉树是否相似
(二)基本要求
1.用二叉链表的形式存储二叉树
2.利用C的图形功能显示二叉树形态
(三)测试数据
自拟
(四)实现提示
充分理解递归原理及实现方法。
以下是参考代码:
int level(BiTree T) /*计算二叉树的层次*/
{
int l1,l2;
if(T==NULL) return 0;
else{l1=level(T->lchild);
l2=level(T->rchild);
return l1>l2?l1+1:l2+1;
}
}
int leaf(BiTree T) /*求二叉树叶子结点个数,用递归算法实现*/
{
int n1,n2;
if(T==NULL)return 0;
elseif(T->lchild==NULL&&T->rchild==NULL)
return 1;
else{n1=leaf(T->lchild);
n2=leaf(T->rchild);
return n1+n2;
}
}
int nodes(BiTree T) /*求二叉树结点个数,用递归算法实现*/
{
int n1,n2;
if(T==NULL)return 0;
elseif(T->lchild==NULL&&T->rchild==NULL)
return 1;
else{n1=nodes(T->lchild);
n2=nodes(T->rchild);
return n1+n2+1;
}
}
int node1(BiTree T) /*求二叉树度为1的结点个数,用递归算法实现*/
{
int n1,n2,n=0;
if(T==NULL)return 0;
else {
if(T->lchild&&T->rchild==NULL||T->lchild==NULL&&T->rchild)
n=1;
n1=node1(T->lchild);
n2=node1(T->rchild);
returnn1+n2+n;
}
}
int node2(BiTree T) /*求二叉树度为2的结点个数,用递归算法实现*/
{
int n=0,n1,n2;
if(T==NULL)return 0;
else {
if(T->lchild&&T->rchild)
n=1;
n1=node2(T->lchild);
n2=node2(T->rchild);
returnn+n1+n2;
}
}
void Copy(BiTree T,BiTree *T2) /*复制二叉树*/
{
if(T==NULL)*T2=NULL;
else{*T2=(BiTree)malloc(sizeof(BiTNode));
(*T2)->data=T->data;
Copy(T->lchild,&(*T2)->lchild);
Copy(T->rchild,&(*T2)->rchild);
}/*else*/
}
void exchange(BiTree *T) /*交换二叉树的左右子树*/
{
BiTNode *t;
if(*T)
{t=(*T)->lchild;
(*T)->lchild=(*T)->rchild;
(*T)->rchild=t;
exchange(&(*T)->lchild);
exchange(&(*T)->rchild);
}
}
int IsCompleteBiTree(BiTree T) /*判断一棵二叉树是否为完全二叉树,利用队列实现*/
{BiTNode *p;
LinkQueue Q;
InitQueue(&Q);
EnQueue(&Q,T);
while(!QueueEmpty(Q))
{
DeQueue(&Q,&p);
if(p==NULL) /*出现了空结点*/
{while(!QueueEmpty(Q))/*判断其后面是否还有非空结点,若有则不是完全二叉树*/
{DeQueue(&Q,&p);
if(p!=NULL)
return 0;
}
return 1;
}/*if*/
else{EnQueue(&Q,p->lchild);
EnQueue(&Q,p->rchild);
}
}/*while*/
}