树的深度是树结构中的一个重要概念,它代表了从根节点到最远叶子节点的最长路径上的节点数,在Java中,计算树的深度有多种方法,包括递归、迭代以及基于不同树结构的特定算法,本文将详细介绍这些方法,并提供相应的代码示例,帮助读者全面理解如何在Java中实现树的深度计算。

递归方法
递归是最直观且常用的计算树深度的方法,其基本思想是:树的深度等于其左子树深度和右子树深度中的较大值,再加上1(根节点本身),对于空树,深度定义为0,这种方法的时间复杂度为O(n),其中n是树中节点的数量,因为每个节点都会被访问一次。
以下是使用递归方法计算二叉树深度的Java代码示例:
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class TreeDepth {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
int leftDepth = maxDepth(root.left);
int rightDepth = maxDepth(root.right);
return Math.max(leftDepth, rightDepth) + 1;
}
}
在上述代码中,maxDepth方法通过递归调用自身来计算左右子树的深度,并返回较大值加1,这种方法简洁易懂,适用于大多数二叉树场景。
迭代方法
迭代方法通常使用栈或队列来模拟递归过程,对于计算树深度,可以使用后序遍历的迭代方式,即通过栈来存储节点及其当前深度,每次弹出节点时更新最大深度,这种方法的时间复杂度同样为O(n),但空间复杂度可能因栈的深度而异。
以下是使用迭代方法计算二叉树深度的Java代码示例:

import java.util.Stack;
public class TreeDepth {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
Stack<TreeNode> stack = new Stack<>();
Stack<Integer> depthStack = new Stack<>();
stack.push(root);
depthStack.push(1);
int maxDepth = 0;
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
int currentDepth = depthStack.pop();
maxDepth = Math.max(maxDepth, currentDepth);
if (node.left != null) {
stack.push(node.left);
depthStack.push(currentDepth + 1);
}
if (node.right != null) {
stack.push(node.right);
depthStack.push(currentDepth + 1);
}
}
return maxDepth;
}
}
在上述代码中,使用两个栈分别存储节点和对应的深度,通过遍历树并更新最大深度来得到结果,这种方法避免了递归可能导致的栈溢出问题,适用于深度较大的树。
广度优先搜索(BFS)方法
广度优先搜索(BFS)也可以用来计算树的深度,BFS按层次遍历树,每次遍历一层时,深度加1,这种方法的时间复杂度为O(n),空间复杂度为O(n),最坏情况下需要存储最后一层的所有节点。
以下是使用BFS方法计算二叉树深度的Java代码示例:
import java.util.LinkedList;
import java.util.Queue;
public class TreeDepth {
public int maxDepth(TreeNode root) {
if (root == null) {
return 0;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
int depth = 0;
while (!queue.isEmpty()) {
int levelSize = queue.size();
for (int i = 0; i < levelSize; i++) {
TreeNode node = queue.poll();
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
depth++;
}
return depth;
}
}
在上述代码中,使用队列来存储每一层的节点,每次处理完一层后深度加1,这种方法直观且易于理解,适合层次分明的树结构。
不同树结构的深度计算
对于非二叉树(如多叉树),深度计算的方法类似,只需调整子节点的遍历方式,对于N叉树,递归方法可以修改为遍历所有子节点并取最大值:

class Node {
int val;
List<Node> children;
Node(int x) { val = x; }
}
public class TreeDepth {
public int maxDepth(Node root) {
if (root == null) {
return 0;
}
int maxChildDepth = 0;
for (Node child : root.children) {
maxChildDepth = Math.max(maxChildDepth, maxDepth(child));
}
return maxChildDepth + 1;
}
}
这种方法同样适用于二叉树,只是子节点数量从两个扩展到多个。
在Java中,计算树的深度可以通过递归、迭代或BFS等多种方法实现,递归方法简洁直观,迭代方法避免了递归的栈溢出风险,BFS方法则按层次遍历树,选择合适的方法取决于具体的应用场景和树的结构,通过理解这些方法的原理和实现,开发者可以灵活应对不同的树深度计算需求。



















