110. 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義為:
乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1:
給定二叉樹[3,9,20,null,null,15,7]
3
/ \9 20
/ \
15 7
返回true
。
示例 2:
給定二叉樹[1,2,2,3,3,null,null,4,4]
1
/ \2 2
/ \3 3
/ \4 4
返回false
。
從頂至底(暴力法)
此方法容易想到,但會產生大量重複計算,時間複雜度較高。
思路是構造乙個獲取當前節點最大深度的方法 depth(root) ,通過比較此子樹的左右子樹的最大高度差abs(depth(root.left) - depth(root.right)),來判斷此子樹是否是二叉平衡樹。若樹的所有子樹都平衡時,此樹才平衡。
演算法流程:
isbalanced(root) :判斷樹 root 是否平衡
特例處理: 若樹根節點 root 為空,則直接返回 truetruetrue ;
返回值: 所有子樹都需要滿足平衡樹性質,因此以下三者使用與邏輯 &&\&\&&& 連線;
abs(self.depth(root.left) - self.depth(root.right)) <= 1 :判斷 當前子樹 是否是平衡樹;
self.isbalanced(root.left) : 先序遍歷遞迴,判斷 當前子樹的左子樹 是否是平衡樹;
self.isbalanced(root.right) : 先序遍歷遞迴,判斷 當前子樹的右子樹 是否是平衡樹;
depth(root) : 計算樹 root 的最大高度
終止條件: 當 root 為空,即越過葉子節點,則返回高度 000 ;
返回值: 返回左 / 右子樹的最大高度加 1 。
複雜度分析:
時間複雜度 o(nlog2n)o(nlog_2 n)o(nlog2n): 最差情況下, isbalanced(root) 遍歷樹所有節點,占用 o(n)o(n)o(n) ;判斷每個節點的最大高度 depth(root) 需要遍歷 各子樹的所有節點 ,子樹的節點數的複雜度為 o(log2n)o(log_2 n)o(log2n) 。
空間複雜度 o(n)o(n)o(n): 最差情況下(樹退化為鍊錶時),系統遞迴需要使用 o(n)o(n)o(n) 的棧空間。
class solution:
def isbalanced(self, root: treenode) -> bool:
if not root: return true
return abs(self.depth(root.left) - self.depth(root.right)) <= 1 and \
self.isbalanced(root.left) and self.isbalanced(root.right)
def depth(self, root):
if not root: return 0
return max(self.depth(root.left), self.depth(root.right)) + 1
leetcode 110 平衡二叉樹 平衡二叉樹
leetcode 110 平衡二叉樹 平衡二叉樹要求所有節點的左右子樹的高度差小於1,因此,只需在遍歷的時候返回其左右子樹的深度。definition for a binary tree node.public class treenode treenode int val treenode int...
LeetCode110 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回true。示例 2 給定二叉樹 1,2,2,3,3,null,nul...
LeetCode 110 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7返回true。示例 2 給定二叉樹 1,2,2,3,3,null,nul...