Leetcode 刷题日记
2021.2.15
题目链接:
https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/submissions/
问题描述:
给出一棵树的根节点,判定这棵树是否为平衡二叉树
解答1:
递归+深度计算函数
代码:
public class Solution {
public boolean isBalanced(TreeNode root) {
if(root == null) return true;
else if(root.left == null && root.right == null) return true;
else if(root.left != null && root.right == null) return maxDepth(root.left) <= 1 && isBalanced(root.left);
else if(root.left == null && root.right != null) return maxDepth(root.right) <= 1 && isBalanced(root.right);
else return Math.abs(maxDepth(root.left) - maxDepth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
}
public static int maxDepth(TreeNode root) {
if(root == null) return 0;
else if(root.left == null && root.right == null) return 1;
else if(root.left != null && root.right == null) return maxDepth(root.left) + 1;
else if(root.left == null && root.right != null) return maxDepth(root.right) + 1;
else return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1;
}
}
分析:
时间复杂度:O(nlog(n))
空间复杂度:O(n)
运行结果:
评注:
这是最容易想到的方法,计算深度时借用了上一道题的代码。
解答2:
上一方法的基础上进行剪枝优化
(该代码为笔者写出,但思路并非笔者原创。借鉴自https://leetcode-cn.com/problems/ping-heng-er-cha-shu-lcof/solution/mian-shi-ti-55-ii-ping-heng-er-cha-shu-cong-di-zhi/)
代码:
public class Solution {
public boolean isBalanced(TreeNode root) {
return maxDepth(root) != -1;
}
public static int maxDepth(TreeNode root) {
if(root == null) return 0;
//如果根节点为空,则返回0
int leftHeight = maxDepth(root.left);
//获取左子树的高度
int rightHeight = maxDepth(root.right);
//获取右子树的高度
if(leftHeight == -1 || rightHeight == -1) return -1;
else return Math.abs(leftHeight - rightHeight) > 1 ? -1 : Math.max(leftHeight,rightHeight) + 1;
}
}
分析:
时间复杂度:O(n)
空间复杂度:O(n)
运行结果:
评注:
在上一方法的基础上进行了优化,主要是把“深度的计算”和“平衡二叉树的判定”相结合。理论上能提升运行效率,但实际上改变不明显。