问题:给出如下结点的定义,求二叉树叶子结点的个数
typedef struct node{ char data; struct node *lchild; struct node *rchild;}BiNode, *BiTree;复制代码
分析
首先我们要明确的是,怎样一个结点才能作为叶子结点。当一个结点不存在左子树和右子树时,称为叶子结点。而在这里,我们要计算的是一颗二叉树叶子结点的总和。对于计数,我们一般定义一个int型的count变量,当符合条件时便加一。而遍历二叉树在这里的确显得过于繁琐,因为输出条件和计算规则都是一样的,显然递归更适合,如下:
(1) 如果给定节点T为NULL,则是空树,叶子节点为0,返回0;
(2) 如果给定节点T左、右子树均为NULL,则是叶子节点,且叶子节点数为1,返回1;
(3) 如果给定节点T左、右子树不都为NULL,则不是叶子节点,以T为根节点的子树叶子节点数 = T左子树叶子节点数 + T右子树叶子节点数;
实现
int leaf(BiTree t){ if(!t) return 0; //空树,无叶子 else if(!t->lchild && !t->rchild) return 1; else return (leaf(t->lchild) + leaf(t->rchild));} 复制代码