LeetCode-110-平衡二叉樹

平衡二叉樹

題目描述:給定一個(gè)二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義為:

一個(gè)二叉樹每個(gè)節(jié)點(diǎn) 的左右兩個(gè)子樹的高度差的絕對(duì)值不超過 1 。

示例說明請(qǐng)見LeetCode官網(wǎng)。

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/balanced-binary-tree/
著作權(quán)歸領(lǐng)扣網(wǎng)絡(luò)所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系官方授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

解法一:遞歸
  • 首先,添加一個(gè)方法height,該方法通過層序遍歷的方式得到二叉樹的高度。

  • 然后,通過遞歸法判斷二叉樹是否是平衡二叉樹,遞歸過程如下:

    • 如果當(dāng)前根節(jié)點(diǎn)為空,則直接返回true;
    • 否則,計(jì)算當(dāng)前根節(jié)點(diǎn)的左右子樹的高度,如果當(dāng)前根節(jié)點(diǎn)的左右子樹的高度之差不超過1,則遞歸判斷當(dāng)前根節(jié)點(diǎn)的左右子樹是否是平衡二叉樹;否則,返回false。
import com.kaesar.leetcode.TreeNode;

import java.util.LinkedList;
import java.util.Queue;

public class LeetCode_110 {
    /**
     * 遞歸
     *
     * @param root
     * @return
     */
    public static boolean isBalanced(TreeNode root) {
        // 如果當(dāng)前根節(jié)點(diǎn)為null,肯定是平衡的,直接返回true
        if (root == null) {
            return true;
        }
        // 如果當(dāng)前根節(jié)點(diǎn)的左右子樹的高度之差不超過1,則遞歸判斷當(dāng)前根節(jié)點(diǎn)的左右子樹是否是平衡二叉樹
        if (height(root.left) - height(root.right) >= -1 && height(root.left) - height(root.right) <= 1) {
            return isBalanced(root.left) && isBalanced(root.right);
        } else {
            return false;
        }
    }

    /**
     * 層序遍歷:通過計(jì)算二叉樹的層數(shù)來得到二叉樹的高度
     *
     * @param root 當(dāng)前根節(jié)點(diǎn)
     * @return 返回二叉樹的高度
     */
    public static int height(TreeNode root) {
        int result = 0;
        if (root == null) {
            return result;
        }
        Queue<TreeNode> nodes = new LinkedList<>();
        nodes.add(root);
        result = 0;
        while (!nodes.isEmpty()) {
            result++;
            int count = nodes.size();
            while (count > 0) {
                TreeNode cur = nodes.poll();
                if (cur.left != null) {
                    nodes.add(cur.left);
                }
                if (cur.right != null) {
                    nodes.add(cur.right);
                }
                count--;
            }
        }
        return result;
    }

    public static void main(String[] args) {
        // 測(cè)試用例,期望返回結(jié)果: true
        TreeNode root = new TreeNode(3);
        root.left = new TreeNode(9);
        root.right = new TreeNode(20);
        root.right.left = new TreeNode(15);
        root.right.right = new TreeNode(7);

        System.out.println(isBalanced(root));
    }
}

【每日寄語】 把所有的不快給昨天,把所有的希望給明天,把所有的努力給今天。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容