1. 程式人生 > 其它 >力扣LeetCode #110 平衡二叉樹(IsBalanced)

力扣LeetCode #110 平衡二叉樹(IsBalanced)

技術標籤:二叉樹演算法leetcode資料結構java

- 題目描述

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

提示:

  • 樹中的節點數在範圍 [0, 5000] 內
  • -104 <= Node.val <= 104

來源:LeetCode

- 示例

  • 示例 1:
    輸入:root = [3,9,20,null,null,15,7]
    輸出:true
  • 示例 2:
    輸入:root = [1,2,2,3,3,null,null,4,4]
    輸出:false
  • 示例 3:
    輸入:root = []
    輸出:true

- 思路分析

  • 要注意的是,本題中的高度平衡不具有最優子結構,因為父節點高度平衡,子節點不一定平衡,反之,子節點高度平衡,父節點也不一定高度平衡。
  • 兩個子節點都高度平衡 + 和兄弟節點的高度差的絕對值不超過1 = 父節點高度平衡

- JAVA實現

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution { public boolean isBalanced(TreeNode root) { //不具有最佳子結構 //子節點高度平衡 + 和兄弟節點高度差不超過1 = 父節點高度平衡 if(root == null || (root.left == null && root.right == null)) return true; //base case else if(isBalanced(root.left) && isBalanced(root.right)) { //子節點都高度平衡
if(Math.abs(height(root.left)-height(root.right)) <= 1) return true; //高度差的絕對值不超過1 else return false; } else return false; } public int height(TreeNode root) { if(root == null) return 0; else return 1 + Math.max(height(root.left), height(root.right)); } }