一、leetcode算法
1、平衡二叉树
1.1、题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
1.2、思路
思路一:此题我们可以使用递归的方式来解决问题,先递归地判断其左右子树是否平衡,再判断当前节点为根的子树是否平衡。如果一棵子树是平衡的,则返回其高度(高度一定是非负整数),否则返回-1.如果存在一棵子树不平衡,则整个二叉树一定不平衡。
1.3、答案
class Solution { public boolean isBalanced(TreeNode root) { return height(root) >= 0; } public int height(TreeNode root){ if(root == null){ return 0; } int leftHeight = height(root.left); int rightHeight = height(root.right); if(leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1){ return -1; }else { return Math.max(leftHeight,rightHeight) + 1; } } }
复杂度分析
时间复杂度:O(n),其中 n 是二叉树中的节点个数。使用自底向上的递归,每个节点的计算高度和判断是否平衡都只需要处理一次,最坏情况下需要遍历二叉树中的所有节点,因此时间复杂度是 O(n)。
空间复杂度:O(n),其中 n 是二叉树中的节点个数。空间复杂度主要取决于递归调用的层数,递归调用的层数不会超过 n。