问题:
Given a binary tree, determine if it is height-balanced.
For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1.
解决:
【注】平衡二叉树(Self-balancing binary search tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。本题要求判断一棵树是否为平衡二叉树。
① 采用递归的方式判断左右子树高度之差是否为1即可,注意左右子树也需要判断是否平衡。
/**
* Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Solution { // 3 ms public boolean isBalanced(TreeNode root) { if(root == null) return true; int ldepth = getDepth(root.left); int rdepth = getDepth(root.right); if(Math.abs(ldepth - rdepth) <= 1 && isBalanced(root.left) && isBalanced(root.right)) return true; return false; } public int getDepth(TreeNode node){ if(node == null) return 0; return Math.max(getDepth(node.left),getDepth(node.right)) + 1; } }② 在discuss中看到这个,在计算深度时顺便判断左右子树是否平衡,可以提高效率。
public class Solution { //1ms
public boolean isBalanced(TreeNode root) { return helper(root) >= 0; } private int helper(TreeNode root) { //helper方法的作用是计算树的高度同时判断是否平衡,如果不平衡返回-1,平衡返回0,另外最后返回的是树的高度 if (root == null) { return 0; } int ldepth = helper(root.left); if (ldepth == -1) { return -1; } int rdepth = helper(root.right); if (rdepth == -1) { return -1; } if (Math.abs(ldepth - rdepth) > 1) { return -1; } return Math.max(ldepth, rdepth) + 1; } }