以二叉链表作为二更树的存储结构, 编写以下算法:
( 1 ) 统计二叉树的叶结点个数。
int leafnumber(BiTree &T) 统计二叉树叶结点个数
{
if(T==NULL) return 0;
else if(T->lchild==NULL&&T->rchild==NULL)
return 1;
else
return leafnumber(T->rchild)+leafnumber(T->lchild);
}
( 2 ) 判别两稞树是否和等。
#include<stdio.h> //判断两棵树是否相等
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,*BiTree;
void createBiTree(BiTree &T);
bool comparetree(BiTree &T1,BiTree &T2);
main()
{
bool n;
BiTNode *T1,*T2;
createBiTree(T1);
createBiTree(T2);
n=comparetree(T1,T2);
if(n==true) printf("相等");
else printf("不相等") ;
}
void createBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
T=new BiTNode;
T->data=ch;
createBiTree(T->lchild);
createBiTree(T->rchild);
}
}
bool comparetree(BiTree &T1,BiTree &T2)
{
if(T1 == NULL && T2 == NULL)
return true;//都为空,相等。
if(!T1||!T2) //由于上面的判断不成立,则T1,T2至少有一个不为空
return false;//一个空,一个不空,不相等
if(T1->data == T2->data) //如果根节点相等
return comparetree(T1->lchild,T2->lchild) && comparetree(T1->rchild,T2->rchild);//判断左右子树是否都相等
else
return false;
}
( 3 ) 交换二叉树每个结点的左孩子和右孩子。
void changeLR(BiTree &T) //交换每个结点的左右孩子
{
BiTree k;
if(T->lchild==NULL&&T->rchild==NULL)
return ;
if(T)
{
k=T->lchild;
T->lchild=T->rchild;
T->rchild=k;
}
changeLR(T->lchild);
changeLR(T->rchild);
}
void changeLR(BiTree &T)
{
BiTree k;
if(T)
{
k=T->lchild;
T->lchild=T->rchild;
T->rchild=k;
changeLR(T->lchild);
changeLR(T->rchild);
}
}
在栈函数中必须有退栈的过程,比如方法2中changeLR(T->lchild);changeLR(T->rchild);就不能放在if语句外面,放在外面后T可能变成空地址,而不是BITree类型,所以没有左右孩子。
( 5 ) 计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。
int width(BiTree &T) //计算二叉树最大的宽度(采用层次遍历方法,以队列实现)
{
BiTree p;
BiTree Q[100];
int front=1,rear=1,last;
int max=0,tmp=0;
if(T==NULL) return 0;
else{
Q[rear++]=T;
last=rear;
while(front!=rear)
{
p=Q[front++];
tmp++;
if(p->lchild) { Q[rear++]=p->lchild; }
if(p->rchild) { Q[rear++]=p->rchild; }
if(front==last)
{
last=rear;
if(tmp>max)
max=tmp;
tmp=0;
}
}
}
return max;
}
( 6 ) 用按层次顺序遍历二叉树的方法, 统计树中度为1 的结点数目。
int lev(BiTree &T) //按层次顺序遍历,统计树中度为1的结点数目
{
BiTree p;
int count=0;
BiTree Q[100];
int front=1,rear=1;
if(T==NULL) return 0;
else{
Q[rear++]=T;
while(front!=rear)
{
p=Q[front++];
if(p->lchild&&!p->rchild||!p->lchild&&p->rchild)
count++;
if(p->lchild) Q[rear++]=p->lchild;
if(p->rchild) Q[rear++]=p->rchild;
}
}
return count;
}
( 8 ) 输出二叉树中从每个叶子结点到根结点的路径。
void allpath(BiTree &T,char path[],int length) //每个叶子结点到根结点的路径
{
if(T)
{
if(T->lchild==NULL&&T->rchild==NULL)
{ printf("%c",T->data);
for(int i=length-1;i>=1;i--)
printf("%c",path[i]);
printf("\n");
}
else
{ path[length]=T->data;
length++;
allpath(T->lchild,path,length);
allpath(T->rchild,path,length);
}
}
}