数据结构严蔚敏(c语言版)课后算法题答案-树和二叉树

以二叉链表作为二更树的存储结构, 编写以下算法:
( 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);
		}
	}
}

  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

超级码立

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值