一,问题描述
给定一颗二叉树,已知其根结点。
①计算二叉树所有结点的个数
②计算二叉树中叶子结点的个数
③计算二叉树中满节点(度为2)的个数
二,算法分析
找出各个问题的基准条件,然后采用递归的方式实现。
①计算二叉树所有结点的个数
1)当树为空时,结点个数为0,否则为根节点个数 加上 根的左子树中节点个数 再加上 根的右子树中节点的个数
借助遍历二叉树的思路,每访问一个结点,计数增1。因此,可使用类似于先序遍历的思路来实现,代码如下:
1 //计算树中节点个数
2 private int nubmerOfNodes(BinaryNoderoot){3 int nodes = 0;4 if(root == null)5 return 0;6 else{7 nodes = 1 + nubmerOfNodes(root.left) +nubmerOfNodes(root.right);8 }9 returnnodes;10 }
计算树中节点个数的代码方法与计算树的高度的代码非常相似!
②计算叶子结点的个数
1)当树为空时,叶子结点个数为0
2)当某个节点的左右子树均为空时,表明该结点为叶子结点,返回1
3)当某个节点有左子树,或者有右子树时,或者既有左子树又有右子树时,说明该节点不是叶子结点,因此叶结点个数等于左子树中叶子结点个数 加上 右子树中叶子结点的个数
这种形式的递归返回的node值 是最外层方法的node。
1 //计算树中叶结点的个数
2 private int numberOfLeafs(BinaryNoderoot){3 int nodes = 0;4 if(root == null)5 return 0;6 else if(root.left == null && root.right == null)7 return 1;8 else
9 nodes = numberOfLeafs(root.left) +numberOfLeafs(root.right);10 returnnodes;11 }
③计算满节点的个数(对于二叉树而言,满节点是度为2的节点)
满节点的基准情况有点复杂:
1)当树为空时,满节点个数为0
2)当树中只有一个节点时,满节点个数为0
3)当某节点只有左子树时,需要进一步判断左子树中是否存在满节点
4)当某节点只有右子树时,需要进一步判断右子树中是否存在满节点
5)当某节点即有左子树,又有右子树时,说明它是满结点。但是由于它的左子树或者右子树中可能还存在满结点,因此满结点个数等于该节点加上该节点的左子树中满结点的个数 再加上 右子树中满结点的个数。
代码如下:
1 //计算树中度为2的节点的个数-