二叉链表数据结构描述
typedef struct node
{
datatype data;
struct node *lchild,*rchild;
} BinTreeNode;
/*****************************************************
函数功能:用先序遍历递归法求树的叶子结点的数目
函数输入:二叉树根结点
函数输出:无(通过全局量传递叶子结点的数目)
屏幕输出:叶子结点值
*******************************************************/
int sum=0;// 通过全局量传递叶子结点的数目
void LeafNum_DLR(BinTreeNode *root)
{ if ( root!=NULL ) //非空二叉树条件,等效于 if(root)
{ if(!root->lchild && !root->rchild) //是叶子结点则统计并打印
{
sum++; printf("%c ",root->data);
}
LeafNum_DLR(root->lchild); //递归遍历左子树,直到叶子处
LeafNum_DLR(root->rchild); //递归遍历右子树,直到叶子处
}
}
/*****************************************************
函数功能:递归求树的叶子结点的数目
函数输入:根结点地址
函数输出:叶子结点数目
*******************************************************/
int LeafNum(BinTreeNode *root )
{ if (root ==NULL) return(0);
else if (root ->lchild==NULL && root ->rchild==NULL)
return(1);
else return(LeafNum(root->lchild)+LeafNum(root->rchild));
}
/*****************************************************
测试功能:求叶子结点的数目的测试
测试函数:1. 递归求树的叶子结点的数目LeafNum
2.用先序遍历递归法求树的叶子结点的数目LeafNum_DLR
*******************************************************/
int main()
{
BinTreeNode *RPtr;
int i;
RPtr=creatBtree_DLR(RPtr);
LeafNum_DLR(RPtr);
printf("LeafNum_DLR:%d\n ",sum);
i=LeafNum(RPtr);
printf("LeafNum:%d \n",i);
return 0;
}
测试样例
输入ABD@F@@@CE@@@
输出
F E
LeafNum_DLR:2
LeafNum: 2