1. 程式人生 > 其它 >劍指 Offer 55 - II. 平衡二叉樹(後序遍歷+剪枝)

劍指 Offer 55 - II. 平衡二叉樹(後序遍歷+剪枝)

技術標籤:LeetCode後序遍歷剪枝

難度:簡單

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。

示例1:

給定二叉樹 [3,9,20,null,null,15,7],
樹
返回true。

示例2:

給定二叉樹 [1,2,2,3,3,null,null,4,4]
在這裡插入圖片描述
返回false。

解題思路:
本題利用後續遍歷+剪枝的思想,判斷左右子樹的深度差是否大於1,如果是,則判定為非平衡樹,直接返回,無需繼續遞迴,這一步是剪枝的過程;如果不是,則繼續遞迴,直到葉子節點,然後返回,判定為平衡樹。

python程式碼:

# 後序遍歷+剪枝

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isBalanced(self, root: TreeNode) -> bool:
        def dfs(root):
            if not root: return 0
            left_depth =
dfs(root.left) if left_depth == -1: return -1 right_depth = dfs(root.right) if right_depth == -1: return -1 diff = abs(left_depth - right_depth) if diff > 1: return -1 return max(left_depth+1, right_depth+1) return dfs(
root) != -1

複雜度分析:

  • 時間複雜度 O ( N ) O(N) O(N) N N N是節點的數目,最壞情況下(沒有產生剪枝),我們需要遍歷所有節點;
  • 空間複雜度 O ( N ) O(N) O(N):最差的情況是這棵樹是一個連結串列,遞迴的深度為 N N N