第五章 树和二叉树 算法习题1-8
以二叉链表作为二叉树的存储结构,编写以下算法:
(1)统计二叉树的叶结点个数。
//(1)统计二叉树的叶结点个数。
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);
}
(2)判别两棵树是否相等。
//(2)判别两棵树是否相等。
int CmpTree(BiTree T1,BiTree T2)
{
if(T1==NULL&&T2==NULL)
return 1;
else if(T1==NULL||T2==NULL)
return 0;
if(T1->data!=T2->data)
return 0;
left=right=0;
left=CmpTree(T1->lchild,T2->lchild);
right=CmpTree(T1->rchild,T2->rchild);
return left&&right;
}
(3)交换二叉树每个结点的左孩子和右孩子。
//(3)交换二叉树每个结点的左孩子和右孩子。
void ChangeLR(BiTree &T)
{
if(T==NULL) return;
else if(T->lchild==NULL&&T->rchild==NULL)
return;
else
{
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
}
ChangeLR(T->lchild);
ChangeLR(T->rchild);
}
(4)设计二叉树的双序遍历算法(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次访问这个结点,接下来按双序遍历它的右子树)。
//(4)设计二叉树的双序遍历算法
void DoubleTraverse(BiTree T)
{
if(T)
{
cout<<T->data;//访问根结点
DoubleTraverse(T->lchild);//双序遍历左子树
cout<<T->data;//访问根结点
DoubleTraverse(T->rchild);//双序遍历右子树
}
}
(5)计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。
//(5)计算二叉树最大的宽度(二叉树的最大宽度是指二叉树所有层中结点个数的最大值)。
int Width(BiTree T)
{
if(T==NULL)
return 0;
else
{
BiTree Q[];//Q是队列,元素为二叉树结点指针,容量足够大
front=1;//队头指针
rear=1;//队尾指针
last=1;//同层最右结点在队列中的位置
temp=0;//局部宽度
maxw=0;//最大宽度
Q[rear]=T;//根结点入队
while(front<=last)
{
p=Q[front+1];
temp++;//同层元素数加1
if(p->lchild!=NULL)
Q[++rear]=p->lchild;//左子女入队
if(p->rchild!=NULL)
Q[++rear]=p->rchild;//右子女入队
if(front>last)//一层结束
{
last=rear;//last指向下层最右元素
if(temp>maxw) maxw=temp;//更新当前最大宽度
temp=0;
}
}
return maxw;
}
}
(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。
//(6)用按层次顺序遍历二叉树的方法,统计树中具有度为1的结点数目。
int Level(BiTree T)
{
num=0;
if(T)
{
InitQueue(Q);
EnQueue(Q,T);
while(!QueueEmpty(Q))
{
DeQueue(Q,p);
cout<<p->data;
if(p->lchild&&!p->rchild)||(!p->lchild&&p->rchild)
num++;
if(p->lchild) EnQueue(Q,p->lchild);
if(p->rchild) EnQueue(Q,p->rchild);
}
}
return num;
}
(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
//(7)求任意二叉树中第一条最长的路径长度,并输出此路径上各结点的值。
void LongestPath(BiTree T)
{
BiTree p=T,l[],s[];
top=0;longest=0;
while(p||top>0)
{
while(p)
{
s[++top]=p;
tag[top]=0;
p=p->Lc;
}
if(tag[top]==1)
{
if(!s[top]->Lc&&!s[top]->Rc)
if(top>longest)
{
for(i=1;i<=top;i++) l[i]=s[i];
longest=top;
}
top--;
}
else if(top>0)
{
tag[top]=1;
p=s[top]->Rc;
}
}
}
(8)输出二叉树中从每个叶子结点到根结点的路径。
//(8)输出二叉树中从每个叶子结点到根结点的路径。
void AllPath(BiTree T,ElemType path[],int pathlen)
{
if(T!=NULL)
{
if(T->lchild==NULL&&T->rchild==NULL)
{
cout<<" "<<T->data<<"到根结点路径:"<<T->data;
for(i=pathlen-1;i>=0;i--)
cout<<path[i]<<endl;
}
else
{
path[pathlen]=T->data;
pathlen++;
AllPath(T->lchild,path,T->rchild);
AllPath(T->rchild,path,T->rchild);
pathlen--;
}
}
}