1.问题描述:
若用二叉链表作为二叉树的储存表示,设计算法求出二叉树中度为 1 的结点个数。
2.问题分析
通过二叉树结构的递归特性来实现。若某结点的左右子树都不为空,则该结点拥有的度为1的结点为左右孩子结点拥有的之和;若某结点的左子树为空,右子树不为空,则该结点拥有的度为1的结点为该结点自身加上,右子树拥有的之和;同理,某结点的右子树为空,左子树不为空,则该结点拥有的度为1的结点为该结点自身加上,右子树拥有的之和;若该结点没有左右子树,则返回0。
4.完整代码
//n1,n1=n-2n2-1 个
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef char Elem;
//定义二叉树结点
typedef struct BiTNode{
Elem data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//初始化二叉树
int InitBiTree(BiTree *T){
*T=NULL;
return 0;
}
//前序创建二叉树,#表示空
void CreateBiTree(BiTree *T)
{
Elem ch;
scanf("%c",&ch);
if(ch=='#')
*T=NULL;
else
{
*T=(BiTree)malloc(sizeof(BiTNode));
if(!*T)
exit(0);
(*T)->data=ch; /* 生成根结点 */
CreateBiTree(&(*T)->lchild); /* 构造左子树 */
CreateBiTree(&(*T)->rchild); /* 构造右子树 */
}
}
//递归统计二叉树中度为1结点
int Num(BiTree p){
if(p->lchild!=NULL&&p->rchild!=NULL) //若某节点左右孩子都不为空,
return Num(p->lchild)+Num(p->rchild); //则该结点下的度为1的结点为左右孩子的之和
else if(p->lchild==NULL&&p->rchild!=NULL) //若某节点左子树空
return 1+Num(p->rchild); //N 为该结点自身和右结点的之和
else if(p->lchild!=NULL&&p->rchild==NULL) //同理
return 1+Num(p->lchild);
return 0;
}
int main(void){
char str;
BiTree T;
printf("前序创建二叉树,请输入数据:\n");
CreateBiTree(&T);
int N=Num(T); //定义度为1的结点个数为N
printf("N=%d\n",N);
return 0;
}
5.调试
开始时思路错误,统计度为0的结点和总结点,通过公式计算,但是在统计度为0的结点的时候统计总空指针数目/2,只能在特定情况下计算出正确答案。
6.运行结果
7.总结
要利用二叉树结构递归的特性来解决问题。