输出二叉树叶子节点数目,用递归实现方式,如果二叉树是一个空树,则输出0,如果二叉树存在,则如果存在节点的左孩子和右孩子节点都是空,则返回1,否则递归左孩子和右孩子。
非递归实现统计二叉树叶子节点数目,按层次遍历,需要借助队列来实现
先定义一个变量,用来计数叶子节点
根节点入队,在while循环的时候,先出队,然后用当前节点指向出队队头节点
如果存在左孩子节点,则左孩子入队
如果存在右孩子节点,则右孩子入队
如果当前不存在左孩子和右孩子,则leafCount自增
实现过程如下所示:
package cn.edu.nwu.tree;
import java.util.LinkedList;
import java.util.Queue;
/**
* @author jcm
*
*时间 2016年9月15日
*/
public class GetTreeNodeLeaf {
public static void main(String[] args) {
TreeNode root = CreateBinaryTree.createTreeNode();
System.out.println("递归实现统计二叉树叶子节点数");
System.out.println(getTreeNodeLeafRecursion(root));
System.out.println("非递归实现统计二叉树叶子节点数");
System.out.println(getTreeNodeLeaf(root));
}
/**
* @author jcm
* 递归实现二叉树的统计叶子节点
* @param root
* @return
*/
public static int getTreeNodeLeafRecursion(TreeNode root){
if(root == null){
return 0;
}
if(root.leftChild == null && root.rightRight == null){
return 1;
}
return getTreeNodeLeafRecursion(root.leftChild)+getTreeNodeLeafRecursion(root.rightRight);
}
/**
* @author jcm
* 还是按层次遍历,需要借助队列来实现
* 先定义一个变量,用来计数叶子节点
* 根节点入队,在while循环的时候,先出队,然后用当前节点指向出队队头节点
* 如果存在左孩子节点,则左孩子入队
* 如果存在右孩子节点,则右孩子入队
* 如果当前不存在左孩子和右孩子,则leafCount自增
* @param root
* @return
*/
private static int getTreeNodeLeaf(TreeNode root) {
if(root == null){
return 0;
}
int leafCount = 0;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode current = queue.remove();
if(current.leftChild != null){
queue.add(current.leftChild);
}
if(current.rightRight != null){
queue.add(current.rightRight);
}
if(current.leftChild == null && current.rightRight == null){
leafCount++;
}
}
return leafCount;
}
}