数据结构习题——求双分支结点数/判断两树是否相似

前言

王道二叉树习题9,17

正文

题目一:

计算一颗二叉树T中所有双分支结点数

f(T)=0 若T=NULL
f(T)=f(T->lchild)+f(T->rchild)+1 若T为双分支结点
f(T)=f(T->lchild)+f(T->rchild) 其他情况

如果一个根结点左右子树都不为NULL,进入第二种情况,再递归判断它的左右子树是否为双分支结点。否则进入第三种情况,直到结点为NULL返回0
代码初看起来递归很绕,因为左右两边都要遍历所以返回值是两个函数相加

递归
int DsonNode(BiTree T){
	if(T==NULL)
	   return 0;
    else if(T->lchild&&T->rchild )
       return DsonNode(T->lchild)+DsonNode(T->rchild)+1;
    else
       return DsonNode(T->lchild)+DsonNode(T->rchild);
}

题目二:

判断两树是否相似

两个出口:

  1. p和q同时为NULL,则返回1
  2. p和q有一个为NULL另一个不为NULL,则返回0

四个判断:(以某结点为根)

  1. left=0,right=0,结果为0(左右子树均不相似)
  2. left=0,right=1,结果为0(左相似右不相似)
  3. left=1,right=0,结果为0(左不相似右相似)
  4. left=1,right=1,结果为1(左右子树均相似)
递归
int similar(BiTree p,BiTree q){
	if(p==NULL&&q==NULL)
	   return 1;
    else if(p==NULL||q=NULL)
       return 0;
    else{
    	left=similar(p->lchild,q->lchild);
    	right=similar(p->rchild,q->rchild);
	}
	if(left==1&&right==1)
	   return 1;
    else 
       return 0;
}
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值