leetcode 110 平衡二叉樹

2021-10-05 08:44:41 字數 1813 閱讀 3142

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(nlog2​n): 最差情況下, isbalanced(root) 遍歷樹所有節點,占用 o(n)o(n)o(n) ;判斷每個節點的最大高度 depth(root) 需要遍歷 各子樹的所有節點 ,子樹的節點數的複雜度為 o(log2n)o(log_2 n)o(log2​n) 。

空間複雜度 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...