剑指 Offer 55 - II. 平衡二叉树
110. 平衡二叉树
题目描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。
如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
输入输出
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7 返回 true
给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4 4 返回 false
|
基本思路
方法一(从上到下递归):
三个与:
当前子树是否平衡
当前子树的左子树是否平衡
当前子树的右子树是否平衡
方法二(从下到上递归 时复更小 因为剪枝了):
java实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
class Solution { public boolean isBalanced(TreeNode root) { if(root == null) return true; return Math.abs(depth(root.left) - depth(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right); }
public int depth(TreeNode root){ if(root == null) return 0; return Math.max(depth(root.left), depth(root.right)) + 1; } }
class Solution { public boolean isBalanced(TreeNode root) { return recur(root) != -1; }
public int recur(TreeNode root){ if(root == null) return 0; int left = recur(root.left); if(left == -1) return -1; int right = recur(root.right); if(right == -1) return -1; return Math.abs(left-right) <= 1 ? Math.max(left, right)+1 : -1; } }
|