二叉树的高度有两种定义:
-
从根节点到最深节点的最长路径的节点数。
-
从根到最深节点的最长路径的边数。
在这篇文章中,我们采用第一种定义。例如,下面这棵树的高度是3:
计算二叉树高度有两种方法,一种是使用二叉树的层级遍历法,一种是使用递归法。
层级遍历法计算高度
我们可以使用二叉树的层级遍历法来计算二叉树的高度,这种方式的主要步骤是:
- 创建空队列保存二叉树的每一层节点,初始化标识二叉树高度的变量height为0
- 一层一层地遍历二叉树,每向下遍历一层,高度height加1
- 计算每一层的节点数量,当下一层的节点为0时,结束遍历
代码如下:
/**
* 二叉树的高度:使用迭代方式,时间复杂度O(n)
*
* @param root 二叉树的根节点
* @return 二叉树的高度
*/
public int heightWithIterative(TreeNode root) {
if (root == null) {
return 0;
}
// 创建空队列保存二叉树的每一层节点
Queue<TreeNode> queue = new LinkedList<>();
// 把root节点加入队列并初始化高度为0
queue.add(root);
int height = 0;
while (queue.size() > 0) {
// 获取当前层级的节点数量
int nodeCount = queue.size();
if (nodeCount == 0) {
break;
}
// 高度加1
height++;
// 取出并移除当前层级的节点,并将下一层级的节点放入队列中
while (nodeCount > 0) {
TreeNode node = queue.remove();
if (node.left != null) {
queue.add(node.left);
}
if (node.right != null) {
queue.add(node.right);
}
nodeCount--;
}
}
return height;
}
递归法计算高度
/**
* 二叉树的高度:使用递归,时间复杂度O(n)
*
* @param root
* 二叉树的根节点
* @return 二叉树的高度
*/
public int height(TreeNode root) {
if (root != null) {
// 左子树与右子树的高度取最大值加上当前节点
return Math.max(height(root.left), height(root.right)) + 1;
}
return 0;
}