求解二叉树第K层节点数目,使用递归解法,第k层的节点数=第k-1层左孩子节点数+第k-1层右孩子节点数目,直到k==1时,说明已经到了第K层。
非递归实现二叉树的第K层节点数目,需要借助队列,与求解二叉树深度相似,只是在while循环条件多加了判断k>1,如果k>1,说明已经遍历在k-1层,这样刚好在遍历的过程中已经求解出下一层的节点个数即第k层
实现过程如下所示:
package cn.edu.nwu.tree;
import java.util.LinkedList;
import java.util.Queue;
/**
* @author jcm
*
*时间 2016年9月16日
*/
public class GetTreeNodeKthLevelNodeNum {
public static void main(String[] args) {
TreeNode root = CreateBinaryTree.createTreeNode();
System.out.println(getKthLevelNodeNumRecursion(root,3));
System.out.println(getKthLevelNodeNum(root,3));
}
/**
* @author jcm
* 使用递归去求二叉树第K层的节点个数
* (1)如果二叉树为空或者k<1返回0
* (2)如果二叉树不为空并且k==1,返回1
* (3)如果二叉树不为空且k>1,返回root.leftChild的k-1层的节点个数与root.rightRightd的k-1层节点个数之和
* 其实质是求k遍历到1时,刚好是第k层
* @param root
* @param k
* @return
*/
public static int getKthLevelNodeNumRecursion(TreeNode root,int k){
if(root == null || k < 1){
return 0;
}
if(k==1){
return 1;
}
int leftTreeNodeNum = getKthLevelNodeNumRecursion(root.leftChild,k-1);
int rightTreeNodeNum = getKthLevelNodeNumRecursion(root.rightRight,k-1);
return leftTreeNodeNum+rightTreeNodeNum;
}
/**
* @author jcm
* 求二叉树第K层的节点个数,与求二叉树的深度相似,只是在while循环条件多加了判断k>1,
* 如果k>1,说明已经遍历在k-1层,这样刚好在遍历的过程中已经求解出下一层的节点个数即第k层
* @param root
* @param k
* @return
*/
public static int getKthLevelNodeNum(TreeNode root,int k){
if(root == null || k<1){
return 0;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
int currentLevelTreeNodeNum = 1;
int nextLevelTreeNodeNum = 0;
//与求二叉树的深度一样,其他的多不变,只是在while多加判断提交k>1
while(!queue.isEmpty() && k>1){
TreeNode current = queue.remove();
currentLevelTreeNodeNum--;
if(current.leftChild != null){
queue.add(current.leftChild);
nextLevelTreeNodeNum++;
}
if(current.rightRight != null){
queue.add(current.rightRight);
nextLevelTreeNodeNum++;
}
if(currentLevelTreeNodeNum ==0){
currentLevelTreeNodeNum = nextLevelTreeNodeNum;
nextLevelTreeNodeNum = 0;
k--;
}
}
return currentLevelTreeNodeNum;
}
}