【LeetCode刷题记录】31.检查平衡性

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

题目来源:LeetCode-检查平衡性

实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下:任意一个节点,其两棵子树的高度差不超过 1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7
复制代码

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

      1
     / \
    2   2
   / \
  3   3
 / \
4   4
复制代码

返回 false 。

二、思路分析:

思路一:

根据平衡性的定义,计算每个节点的左右子树高度。

如果某个节点的左右子树高度差大于1,则不平衡,返回false,结束;否则说明以当前节点为根的子树是平衡的,继续检查当前节点的左右子树的平衡性。

计算二叉树的高度

递归,当前二叉树的高度 = max(左子树高度, 右子树高度) + 1max(左子树高度,右子树高度)+1

左子树高度的计算方法相同

若当前节点为null,返回0,为递归出口

按照以上分解方法可以到达递归出口

思路二:

从顶至底,每个node判断一遍

思路三:

从底至顶,创建一个计算最大高度的方法,如果left和right相差大于1就返回-1

三、AC 代码:

四、总结:

思路一:

    class Solution {
        public boolean isBalanced(TreeNode root) {
            if (root == null) return true;
            int leftTreeD = treeDepth(root.left);
            int rightTreeD = treeDepth(root.right);
            if (Math.abs(leftTreeD - rightTreeD) > 1) return false;
            return isBalanced(root.left) && isBalanced(root.right);
        }

        public int treeDepth(TreeNode root) {
            if (root == null) return 0;
            return Math.max(treeDepth(root.left), treeDepth(root.right)) + 1;
        }
    }
复制代码

思路二:

    class Solution {

        public boolean isBalanced(TreeNode root) {
            if (root == null) {
                return true;
            }
            if (Math.abs(check(root.left) - check(root.right)) > 1) {
                return false;
            }
            return isBalanced(root.left) && isBalanced(root.right);
        }

        public int check(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int maxLong = Math.max(check(root.left), check(root.right)) + 1;
            return maxLong;
        }
    }
复制代码

思路三:

    class Solution {
        public boolean isBalanced(TreeNode root) {
            return recursion(root) != -1;
        }

        private int recursion(TreeNode root) {
            if (root == null) {
                return 0;
            }
            int leftValue = recursion(root.left);
            if (leftValue == -1) {
                return -1;
            }
            int rightValue = recursion(root.right);
            if (rightValue == -1) {
                return -1;
            }
            if (Math.abs(leftValue - rightValue) > 1) {
                return -1;
            }
            return Math.max(leftValue, rightValue) + 1;
        }
    }
复制代码

猜你喜欢

转载自juejin.im/post/7079744525102481415