力扣简110 平衡二叉树
递归 自底向上
//给定一个二叉树,判断它是否是高度平衡的二叉树:一个二叉树"每个"节点 的左右两个子树的高度差的绝对值不超过 1
//我以为光根的左右子树了! 最初[1,2,2,3,null,null,3,4,null,null,4]报错,然后改正!写的还挺快的,熟能生巧嘻嘻。

看到别人说这种复杂度太高了555,为什么高级解法我一个都想不到!不着急,慢慢来。
package leetcode01; public class Solution110 { //给定一个二叉树,判断它是否是高度平衡的二叉树:一个二叉树"每个"节点 的左右两个子树的高度差的绝对值不超过 1 //我以为光根的左右子树了! 最初[1,2,2,3,null,null,3,4,null,null,4]报错,然后改正! public static boolean isBalanced(TreeNode root) { if(root==null) { return true; } else{ if(Math.abs(height(root.left)-height(root.right))<=1) { return (isBalanced(root.left) && isBalanced(root.right)); } else{ return false; } } } public static int height(TreeNode root) { if(root==null) { return 0; } else { return Math.max(height(root.left), height(root.right))+1; } } public static void main(String[] args) { // TODO Auto-generated method stub } }
题解1思路完全一致,代码处的优化:直接把isBalanced中的else里的if去掉,换成return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right);
题解2 自底向上 时间复杂度会低 但是看了题解敲了一遍发现实际执行内存更大 不知道为啥
public static boolean isBalanced(TreeNode root) { return height(root)>=0; } public static int height(TreeNode root) { if(root==null) { return 0; } int left=height(root.left); int right=height(root.right); if(left==-1 || right==-1 ||Math.abs(left-right)>1 ) return -1; else return Math.max(left, right)+1; }

浙公网安备 33010602011771号