剑指 Offer.II-平衡二叉树
剑指 Offer.II-平衡二叉树
题目链接
<剑指 Offer 55 - II. 平衡二叉树>
问题描述
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
个人解法(先序遍历 + 深度判断)
构造一个计算当前子树深度的函数,通过比较左右子树的差,判断子树是否为平衡二叉树,若所有子树都平衡,则此树平衡
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| 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); } private int depth(TreeNode root) { if (root == null) return 0; return Math.max(depth(root.left), depth(root.right)) + 1; } }
|
官方解法(后续遍历 + 剪枝)
对二叉树做后序遍历,从底部返回二叉树的深度,若判断到当前子树不是平衡树,则直接对其进行剪枝,提前返回
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| class Solution { public boolean isBalanced(TreeNode root) { return recur(root) != -1; }
private 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) < 2 ? Math.max(left, right) + 1 : -1; } }
|