2026/2/24 7:43:00
网站建设
项目流程
宁夏网站建设费用,风险地区查询最新,返利商城网站怎么做,安徽网络推广排名#x1f4cb; 问题描述
给定一个二叉树#xff0c;判断它是否是高度平衡的二叉树。
平衡二叉树的定义#xff1a;一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
#x1f4a1; 解题思路
1. 理解平衡二叉树
平衡二叉树不仅仅是根节点的左右子树高度差不超… 问题描述给定一个二叉树判断它是否是高度平衡的二叉树。平衡二叉树的定义一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。 解题思路1. 理解平衡二叉树平衡二叉树不仅仅是根节点的左右子树高度差不超过1而是每个节点都必须满足这个条件。关键点空树是平衡的每个节点都需要检查需要同时获取子树的高度和平衡状态 多种解法解法1自顶向下递归朴素解法class Solution { public boolean isBalanced(TreeNode root) { if (root null) return true; // 检查当前节点是否平衡 int leftHeight height(root.left); int rightHeight height(root.right); boolean currentBalanced Math.abs(leftHeight - rightHeight) 1; // 递归检查左右子树 return currentBalanced isBalanced(root.left) isBalanced(root.right); } private int height(TreeNode root) { if (root null) return 0; return Math.max(height(root.left), height(root.right)) 1; } }复杂度分析时间复杂度O(n²) - 每个节点都要计算高度而高度计算本身也是O(n)空间复杂度O(n) - 递归栈深度缺点存在大量重复计算解法2自底向上递归最优解class Solution { public boolean isBalanced(TreeNode root) { return dfs(root) ! -1; } private int dfs(TreeNode node) { if (node null) { return 0; } // 递归获取左子树高度 int h_left dfs(node.left); if (h_left -1) { return -1; } // 递归获取右子树高度 int h_right dfs(node.right); if (h_right -1) { return -1; } // 检查当前节点是否平衡 if (Math.abs(h_left - h_right) 1) { return -1; } // 返回当前节点的高度 return Math.max(h_left, h_right) 1; } }复杂度分析时间复杂度O(n) - 每个节点只访问一次空间复杂度O(h) - 递归栈深度h为树的高度优点一次遍历同时完成高度计算和平衡判断避免重复计算尽早发现不平衡情况并终止递归解法3迭代法避免递归栈溢出javaimport java.util.*; class Solution { public boolean isBalanced(TreeNode root) { if (root null) return true; MapTreeNode, Integer heights new HashMap(); DequeTreeNode stack new ArrayDeque(); // 后序遍历 TreeNode lastVisited null; TreeNode node root; while (!stack.isEmpty() || node ! null) { if (node ! null) { stack.push(node); node node.left; } else { TreeNode peek stack.peek(); if (peek.right ! null peek.right ! lastVisited) { node peek.right; } else { TreeNode curr stack.pop(); int leftHeight heights.getOrDefault(curr.left, 0); int rightHeight heights.getOrDefault(curr.right, 0); if (Math.abs(leftHeight - rightHeight) 1) { return false; } heights.put(curr, Math.max(leftHeight, rightHeight) 1); lastVisited curr; } } } return true; } }复杂度分析时间复杂度O(n)空间复杂度O(n)适用场景树非常深递归可能导致栈溢出时使用 算法对比表方法时间复杂度空间复杂度代码复杂度适用场景推荐指数自顶向下递归O(n²)O(n)简单小规模数据⭐⭐自底向上递归O(n)O(h)简单通用场景⭐⭐⭐⭐⭐迭代法O(n)O(n)中等避免栈溢出⭐⭐⭐ 面试技巧1. 问题分析步骤text1. 确认平衡二叉树的定义 2. 思考暴力解法自顶向下 3. 分析暴力解法的缺点重复计算 4. 优化思路自底向上一次遍历 5. 实现优化解法2. 代码实现要点使用-1表示不平衡状态尽早返回减少不必要的递归注意空树是平衡的特殊情况3. 复杂度分析时间O(n) - 每个节点访问一次空间O(h) - 递归栈深度最坏情况O(n)4. 常见Follow-up问题Q如果树非常大递归会栈溢出怎么办A可以使用迭代版本用栈模拟递归。Q能写出非递归版本吗A使用后序遍历的迭代实现同时记录节点高度。Q如何测试你的算法A测试用例应包括空树、单节点树、完全平衡树、完全不平衡树、随机树。 实战练习练习1修改问题 - 返回不平衡的节点javapublic TreeNode findUnbalancedNode(TreeNode root) { // 修改dfs函数返回不平衡节点 // 练习实现这个函数 }练习2计算树的最大深度差javapublic int maxHeightDifference(TreeNode root) { // 返回树中任意节点左右子树的最大高度差 // 练习实现这个函数 } 总结判断平衡二叉树是一个经典的二叉树问题考察对递归、树遍历和算法优化的理解。自底向上递归解法是最优解兼具效率高和代码简洁的优点。关键收获平衡二叉树要求每个节点都满足平衡条件自底向上的思路可以避免重复计算使用特殊返回值如-1可以同时传递高度和状态信息递归和迭代可以互相转换各有适用场景掌握这个问题不仅有助于解决LeetCode 110还能加深对树相关算法的理解为更复杂的树问题打下基础。 相关题目104. 二叉树的最大深度111. 二叉树的最小深度543. 二叉树的直径