求二叉树的最大深度
二叉树的最大深度即二叉树的高度,一般有两个解法,第一种是递归,代码简单,但不太好理解。第二种是使用层序遍历的方式,记录每层的节点数,遍历完一层,层数计数器加一。
一、递归
想要求一颗二叉树的高度,即求孩子节点的最大深度,要么是左孩子,要么是右孩子,那么我们只需要对传入的孩子节点递归调用即可。
/**
* 求二叉树的深度(使用递归)
*
* @param root
* @return
*/
public int getHeight(TreeNode root) {
if (root == null) {
return 0;
}
int leftHeight = getHeight(root.getLeft());
int rightHeight = getHeight(root.getRight());
return leftHeight > rightHeight ? leftHeight + 1 : rightHeight + 1;
}
二、使用层序遍历
通过记录本层元素总数、本层已经访问过的元素,层数计数器来获得二叉树的高度,此中方法也可以获得二叉树的最大宽度。使用这种方式,灵活度比较高。
/**
* 求二叉树的深度(不使用递归)
*
* @param root
* @return
*/
public int getHeight2(TreeNode root) {
if (root == null) {
return 0;
}
LinkedList<TreeNode> list = new LinkedList<>();
list.offer(root);
//最大宽度留备用
int max=0;
//二叉树的深度
int level = 0;
//本层中元素总数
int size = 0;
//本层已经访问过的元素个数
int cur = 0;
while (!list.isEmpty()) {
size = list.size();
max=Math.max(max,size);
cur = 0;
while (cur < size) {
TreeNode node = list.poll();
cur++;
if (node.getLeft() != null) {
list.offer(node.getLeft());
}
if (node.getRight() != null) {
list.offer(node.getRight());
}
}
level++;
}
System.out.println("二叉树最大宽度为:"+max);
return level;
}