叶子结点是指左右子结点都是NULL的结点。编程的精髓在于递归调用。
#include
typedef int DataType;
typedef struct tree
{
DataType data;
struct tree *left;
struct tree *right;
}node,*pnode;
pnode createTreeNode(DataType data)
{
pnode n=(pnode)malloc(sizeof(node));
n->data = data;
n->left = NULL;
n->right = NULL;
return n;
}
void treeTravel(pnode p)
{
if (NULL == p)
{
return;
}
treeTravel(p->left);
printf("%d ", p->data);
treeTravel(p->right);
}
int countNode(pnode p)
{
if(p){
return(countNode(p->left) + countNode(p->right) + 1);
}
return 0;
}
int countLeafNode(pnode p)
{
if(p){
if((p->left == NULL) && (p->right == NULL))return 1;
return(countLeafNode(p->left) + countLeafNode(p->right));
}
return 0;
}
/*
7 1 5 6 2 9 4 8 6
7
1 9
5 8
3 6
2 4
*/
void main()
{
pnode root=NULL;
int NodeNumber = 0;
int leafNodeNumber = 0;
pnode p1=NULL, p2=NULL, p3=NULL, p4=NULL, p5=NULL, p6=NULL, p7=NULL,p8=NULL,p9=NULL;
p1 = createTreeNode(7);
p2 = createTreeNode(1);
p3 = createTreeNode(9);
p4 = createTreeNode(5);
p5 = createTreeNode(8);
p6 = createTreeNode(3);
p7 = createTreeNode(6);
p8 = createTreeNode(2);
p9 = createTreeNode(4);
p1->left = p2;
p1->right = p3;
p2->right = p4;
p3->left = p5;
p4->left = p6;
p4->right = p7;
p6->left = p8;
p6->right = p9;
root = p1;
treeTravel(root);
NodeNumber = countNode(root);
leafNodeNumber = countLeafNode(root);
printf("\n");
printf("node number = %d\n", NodeNumber);
printf("leaf node number = %d\n", leafNodeNumber);
getchar();
}
-bash-3.2$ ./binTree
1 2 3 4 5 6 7 8 9
node number = 9
leaf node number = 4