添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
大气的剪刀  ·  《SeleniumBasic ...·  1 周前    · 
从容的路灯  ·  Using of ...·  6 月前    · 
打酱油的小虾米  ·  Kafka configure jaas ...·  7 月前    · 
愉快的哑铃  ·  java的invoke与getMethod方 ...·  1 年前    · 

大致的思路分为以下几个步骤:

  • 先找到 根节点 对应的 左子树 右子树 的深度,然后进行比较,如深度相差大于 1 则返回 false 即可。如深度相差小于等于 1 则执行后续的步骤
  • 再将 根节点的左孩子 视为 根节点1 ,再对比 根节点1 的左子树和右子树的深度。
  • 再将 根节点的右孩子 视为 根节点2 ,再对比 根节点2 的左子树和右子树的深度。
  • 直到整棵树(包括子树)的高度差都不大于 1 ,这棵树则为 平衡二叉树 。反之,这棵树不为 平衡二叉树
  • 上面说的这种思想,其实是一种 自顶向下 的方法。就是从根节点出发,保证整棵树和所有的子树都能满足 高度差不大于1

    此处以示例1中的树作为例子

  • 比较根节点的左右子树高度差
  • 此时,深度差不大于1,则继续向下选择左右子树。

  • 选择节点 9 作为根节点
  • 9 为叶子节点,无左右孩子,故跳过

  • 选择节点 20 作为根节点
  • 深度差不大于1,继续向下

  • 分别选择节点 15 7 作为根节点
  • 15 7 都为叶子节点,无左右孩子。

    至此已将整棵树遍历完成,未出现深度差大于 1 的情况,故这棵树为 平衡二叉树

    实现代码与思路中保持一致

    public boolean isBalanced (TreeNode root) { if (root != null ){ if (Math.abs(getDeepLen(root.left, 0 ) - getDeepLen(root.right, 0 )) > 1 ){ return false ; } else { return isBalanced(root.left) && isBalanced(root.right); } else { return true ; * 获取树的深度 private int getDeepLen (TreeNode root, int len) { if (root == null ) return len; len++; return Math.max(getDeepLen(root.left, len), getDeepLen(root.right, len));
        public static void main(String[] args) {
            TreeNode treeNode = new TreeNode(3,
                    new TreeNode(9),
                    new TreeNode(20, new TreeNode(15), new TreeNode(7)));
            boolean flag = new Number110().isBalanced(treeNode);
            System.out.println(flag);
    

    虽然 自顶向下 的模式很容易被理解,但是会有很多重复计算的过程。所以不妨使用 自底向上 的模式来实现这一题,只要子树不满足条件,则这棵树一定不为 平衡二叉树

    感谢看到最后,非常荣幸能够帮助到你~♥

    如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~