劍指 Offer 55 - II. 平衡二叉樹(後序遍歷+剪枝)
阿新 • • 發佈:2021-02-10
難度:簡單
輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過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。