本文共 2429 字,大约阅读时间需要 8 分钟。
给定一个二叉树,找出其最大深度。二叉树的深度定义为根节点到最远叶子节点的路径上的节点数。以下是通过递归遍历的方法来计算最大深度的详细解答。
二叉树的深度是从根节点到最远叶子节点的最长路径上的节点数。叶子节点是指没有子节点的节点。例如,二叉树 [3,9,20,null,null,15,7] 的最长路径为 3 -> 15 -> 7,总共有三层,所以最大深度为3。
为了计算二叉树的最大深度,可以使用递归遍历的方法。具体步骤如下:
class Solution { private int maxDep = 0; // 用于记录最大深度的变量 void SeaMaxDepth(TreeNode p, int i) { // 如果当前节点为 null,检查是否是非叶子节点,如果是,比较深度 if (p == null) { if (i > maxDep) { maxDep = i; // 更新最大深度 } return; } // 假设节点有非 null 的左子节点,同样处理右边子节点 SeaMaxDepth(p.left, i + 1); SeaMaxDepth(p.right, i + 1); // 该函数不正确,改为以下方式: // �リー操作错误,正确方式应先进入左递归,然后处理右递归,可能需要重新写作: } // 正确实现方式: // 调用左递归,处理左边子树,并且递增深度 voidSeaMaxDepthLeft(TreeNode p, int i) { if (p == null) { if (i > maxDep) { maxDep = i; } return; } if (p.left == null && p.right == null) { // 是叶子节点 if (i > maxDep) { maxDep = i; } } else if (p.left != null) { SeaMaxDepthLeft(p.left, i + 1); } else { SeaMaxDepthLeft(p.right, i + 1); } } // 调用右递归,处理右边子树,并且递增深度 void SeaMaxDepthRight(TreeNode p, int i) { if (p == null) { if (i > maxDep) { maxDep = i; } return; } if (p.right == null && p.left == null) { // 是叶子节点 if (i > maxDep) { maxDep = i; } } else if (p.right != null) { SeaMaxDepthRight(p.right, i + 1); } else { SeaMaxDepthRight(p.left, i + 1); } } public int maxDepth(TreeNode root) { if (root == null) { return 0; } // 同时处理左子树和右子树,初始深度为1 SeaMaxDepthLeft(root, 1); return maxDep; }
SeaMaxDepthLeft
和 SeaMaxDepthRight
,每个递归调用都会递增深度。对于二叉树 [3,9,20,null,null,15,7],maxDepth
返回3,符合预期。因为从根节点3到叶子节点7的路径长度是3层。
通过递归遍历的方法,能够高效地计算二叉树的最大深度。该方法时间复杂度为 O(n),空间复杂度为 O(h),适用于各种二叉树结构。
转载地址:http://yhgyk.baihongyu.com/