1. 程式人生 > 其它 >[LeetCode] #110 平衡二叉樹

[LeetCode] #110 平衡二叉樹

[LeetCode] #110 平衡二叉樹

給定一個二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義為:一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。

輸入:root = [3,9,20,null,null,15,7]

輸出:true

可以利用求二叉樹高度的函式[LeetCode] #104 二叉樹的最大深度

比較每個節點的左右子樹的高度差,這是自頂向下的解法,需要遍歷每個節點也稱暴力解法

class Solution {
    public boolean isBalanced(TreeNode root) {
        if (root == null) return true;
        
else return Math.abs(height(root.left) - height(root.right)) <= 1 && isBalanced(root.left) && isBalanced(root.right); } } public int height(TreeNode root) { if (root == null) return 0; else return Math.max(height(root.left), height(root.right)) + 1; } }

也可以用自底向上的解法。自底向上遞迴的做法類似於後序遍歷,對於當前遍歷到的節點,先遞迴地判斷其左右子樹是否平衡,再判斷以當前節點為根的子樹是否平衡。如果一棵子樹是平衡的,則返回其高度(高度一定是非負整數),否則返回−1。如果存在一棵子樹不平衡,則整個二叉樹一定不平衡。不一定需要遍歷全部節點。

class Solution {
    public boolean isBalanced(TreeNode root) {
        return height(root) >= 0;
    }

    public int height(TreeNode root) {
        
if (root == null) return 0; int leftHeight = height(root.left); int rightHeight = height(root.right); if (leftHeight == -1 || rightHeight == -1 || Math.abs(leftHeight - rightHeight) > 1) return -1; elsereturn Math.max(leftHeight, rightHeight) + 1; } }

知識點:無

總結:對於判斷樹結構是否滿足要求時,自底向上的解法 時間複雜度 更低。