15黑马笔记之二叉树的递归遍历求叶子节点数
1 思想: 对每一个节点遍历其左右孩子,若都为空,则是叶子节点。递归结束条件:传进的节点不为空。代码基本只是在递归遍历的基础上加了统计叶子数的变量。
2 具体代码实现:
例子:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//定义二叉树节点
typedef struct BINARYNODE{
char ch;
struct BINARYNODE *lchild;
struct BINARYNODE *rchild;
}BinaryNode;
//求叶子节点数
int BinaryLeafNum(BinaryNode *root,int *num){
//递归的条件
//任何一个节点作为根节点时,为空就返回,证明到尽头了
if(root==NULL){
return -1;
}
if(root->lchild==NULL && root->rchild==NULL){
(*num)++;
}
//遍历左子树的叶子节点数
BinaryLeafNum(root->lchild,num);
//遍历右子树的叶子节点数
BinaryLeafNum(root->rchild,num);
return 0;
}
void CreateBinartTree(){
//创建数据节点
BinaryNode node1={'A',NULL,NULL};
BinaryNode node2={'B',NULL,NULL};
BinaryNode node3={'C',NULL,NULL};
BinaryNode node4={'D',NULL,NULL};
BinaryNode node5={'E',NULL,NULL};
BinaryNode node6={'F',NULL,NULL};
BinaryNode node7={'G',NULL,NULL};
BinaryNode node8={'H',NULL,NULL};
//建立节点关系 A-F-G-H
// \B
// \C-E
// \D
node1.lchild=&node2;
node1.rchild=&node6;
node2.rchild=&node3;
node3.lchild=&node4;
node3.rchild=&node5;
node6.rchild=&node7;
node7.rchild=&node8;
//递归遍历
int num=0; //计算叶子节点数
BinaryLeafNum(&node1,&num);
printf("叶子节点数为:%d\n",num);
}
int main(){
CreateBinartTree();
return 0;
}