一.初级思路
拿到题之后的好习惯——先在纸上写思路:
1.构建二叉树:
char* BinTreeBuilding(PBinTreeNode ptr_node,char *ptr_str){
//创建二叉树
ptr_node->info=*ptr_str;
if(*ptr_str!='#'){
PBinTreeNode left=CreateBinTreeNode();
left->dad=ptr_node;ptr_node->lchild=left;
ptr_str++;
ptr_str=BinTreeBuilding(left,ptr_str)+1;
PBinTreeNode right=CreateBinTreeNode();
right->dad=ptr_node;ptr_node->rchild=right;
return BinTreeBuilding(right,ptr_str);
}
else{
return ptr_str;
}
}
2.计算二叉树叶子结点数目:
void LeavesCounting(PBinTreeNode ptr_node,int* ptr_count){
//统计二叉树中叶子结点的数目
if(ptr_node->lchild->info!='#'){
LeavesCounting(ptr_node->lchild,ptr_count);
}
if(ptr_node->rchild->info!='#'){
LeavesCounting(ptr_node->rchild,ptr_count);
}
if(ptr_node->lchild->info=='#'&&ptr_node->rchild->info=='#'){
(*ptr_count)++;
}
}
最后,源码分享:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef char DataType;
typedef struct BinTreeNode{
DataType info;
struct BinTreeNode* lchild;
struct BinTreeNode* rchild;
struct BinTreeNode* dad;
}BinTreeNode,*PBinTreeNode;
void InitializeBinTreeNode(PBinTreeNode PNode){
//初始化二叉树中的一个结点
PNode->info='0';
PNode->lchild=NULL;
PNode->rchild=NULL;
PNode->dad=NULL;
}
PBinTreeNode CreateBinTreeNode(){
//创建二叉树中的一个结点
PBinTreeNode PNode=(PBinTreeNode)malloc(sizeof(BinTreeNode));
if(PNode==NULL){
printf("out of space!");
}else{
InitializeBinTreeNode(PNode);
return PNode;
}
}
char* BinTreeBuilding(PBinTreeNode ptr_node,char *ptr_str){
//创建二叉树
ptr_node->info=*ptr_str;
if(*ptr_str!='#'){
PBinTreeNode left=CreateBinTreeNode();
left->dad=ptr_node;ptr_node->lchild=left;
ptr_str++;
ptr_str=BinTreeBuilding(left,ptr_str)+1;
PBinTreeNode right=CreateBinTreeNode();
right->dad=ptr_node;ptr_node->rchild=right;
return BinTreeBuilding(right,ptr_str);
}
else{
return ptr_str;
}
}
void LeavesCounting(PBinTreeNode ptr_node,int* ptr_count){
//统计二叉树中叶子结点的数目
if(ptr_node->lchild->info!='#'){
LeavesCounting(ptr_node->lchild,ptr_count);
}
if(ptr_node->rchild->info!='#'){
LeavesCounting(ptr_node->rchild,ptr_count);
}
if(ptr_node->lchild->info=='#'&&ptr_node->rchild->info=='#'){
(*ptr_count)++;
}
}
int main(){
char str[1000];
scanf("%s",str);
char *ptr_str=str;
PBinTreeNode ptr_tree=CreateBinTreeNode();
BinTreeBuilding(ptr_tree,ptr_str);
int leaf_count=0;
int *ptr_count=&leaf_count;
LeavesCounting(ptr_tree,ptr_count);
printf("%d",leaf_count);
return 0;
}
推荐大家像我这样,先在纸上把思路都理顺了,最后一步再去上机敲代码,这样子效率会提升很多很多。
二.思路改进
我们改进“二叉树创建函数”:
1.用getchar()代替字符指针ptr_str;
2.将结点的创立放到子函数中完成;
3.在结构体struct BinTreeNode的定义中,去掉指向父节点的指针“*dad”。
改进后的“二叉树创建函数”如下所示:
PBinTreeNode BinTreeBuilding(){
//这里,用getchar()代替字符指针
char s=getchar();
if(s!='#'){
PBinTreeNode cur=CreateBinTreeNode();
cur->info=s;
//将结点的创立下放到子函数中
cur->lchild=BinTreeBuilding();
cur->rchild=BinTreeBuilding();
//去掉了指向父结点的指针
return cur;
}else{
return NULL;
}
}
我们还要改进“叶子结点统计函数”:
1.我们利用好函数的返回值,而不单单只是利用指针
改进后的“叶子结点统计函数”如下所示:
int LeavesCounting(PBinTreeNode ptr_node){
//统计二叉树中叶子结点的数目
if(ptr_node->lchild==NULL&&ptr_node->rchild==NULL){
return 1;
}else{
int n_lchild=0,n_rchild=0;
if(ptr_node->lchild!=NULL){
n_lchild=LeavesCounting(ptr_node->lchild);
}
if(ptr_node->rchild!=NULL){
n_rchild=LeavesCounting(ptr_node->rchild);
}
return n_lchild+n_rchild;
}
}
改进后完整的源代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
typedef char DataType;
typedef struct BinTreeNode{
DataType info;
struct BinTreeNode* lchild;
struct BinTreeNode* rchild;
}BinTreeNode,*PBinTreeNode;
void InitializeBinTreeNode(PBinTreeNode PNode){
//初始化二叉树中的一个结点
PNode->info='0';
PNode->lchild=NULL;
PNode->rchild=NULL;
}
PBinTreeNode CreateBinTreeNode(){
//创建二叉树中的一个结点
PBinTreeNode PNode=(PBinTreeNode)malloc(sizeof(BinTreeNode));
if(PNode==NULL){
printf("out of space!");
}else{
InitializeBinTreeNode(PNode);
return PNode;
}
}
PBinTreeNode BinTreeBuilding(){
//这里,用getchar()代替字符指针
char s=getchar();
if(s!='#'){
PBinTreeNode cur=CreateBinTreeNode();
cur->info=s;
//将结点的创立下放到子函数中
cur->lchild=BinTreeBuilding();
cur->rchild=BinTreeBuilding();
//去掉了指向父结点的指针
return cur;
}else{
return NULL;
}
}
int LeavesCounting(PBinTreeNode ptr_node){
//统计二叉树中叶子结点的数目
if(ptr_node->lchild==NULL&&ptr_node->rchild==NULL){
return 1;
}else{
int n_lchild=0,n_rchild=0;
if(ptr_node->lchild!=NULL){
n_lchild=LeavesCounting(ptr_node->lchild);
}
if(ptr_node->rchild!=NULL){
n_rchild=LeavesCounting(ptr_node->rchild);
}
return n_lchild+n_rchild;
}
}
int main(){
PBinTreeNode ptr_node=BinTreeBuilding();
int leaf_count=LeavesCounting(ptr_node);
printf("%d",leaf_count);
return 0;
}