二叉树的深度,递归实现,如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1,非递归实现,需要队列和两个变量分别是当前层节点数和下一层节点数,如果当前层节点数=0,说明已经访问完了,需要便利下一层,所以需要自增。
实现过程如下所:
package cn.edu.nwu.tree;
import java.util.LinkedList;
import java.util.Queue;
/**
* @author jcm
*
*时间 2016年9月15日
*/
public class GetTreeNodeDepth {
public static void main(String[] args) {
TreeNode root = CreateBinaryTree.createTreeNode();
System.out.println(getTreeNodeDepthRecursion(root));
System.out.println(getTreeNodeDepth(root));
}
/**
* @author jcm
* 求二叉树的深度
* (1)如果二叉树为空,二叉树的深度为0
* (2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1
* @param root
* @return
*/
public static int getTreeNodeDepthRecursion(TreeNode root){
if(root == null){
return 0;
}
return Math.max(getTreeNodeDepthRecursion(root.leftChild), getTreeNodeDepthRecursion(root.rightRight))+1;
}
/**
* @author jcm
* 非递归实现二叉树的深度,需要借助队列来实现
* 所先定义当前层的节点个数,下一层节点个数,深度大小,如果当前层节点数为0,说明当前层的节点已经访问完了,深度自增,把下一层的节点数赋值给当前层节点
* @param root
* @return
*/
public static int getTreeNodeDepth(TreeNode root){
if(root == null){
return 0;
}
//当前层节点数
int currentLevelTreeNode = 1;
//下一层节点数
int nextLevelTreeNode = 0;
int depth = 0;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while(!queue.isEmpty()){
TreeNode current = queue.remove();
currentLevelTreeNode--;
//如果当前节点存在左孩子,则入队,且下一层节点数自增
if(current.leftChild != null){
queue.add(current.leftChild);
nextLevelTreeNode++;
}
//如果当前节点存在右孩子,则入队,且下一层节点数自增
if(current.rightRight != null){
queue.add(current.rightRight);
nextLevelTreeNode++;
}
//如果当前节点数遍历完了,则深度自增
if(currentLevelTreeNode == 0){
depth++;
currentLevelTreeNode = nextLevelTreeNode;
nextLevelTreeNode = 0;
}
}
return depth;
}
}