LeetCode刷題之路 110 平衡二叉樹

2021-10-14 13:51:45 字數 1720 閱讀 7653

給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義為:

乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 1 。

示例 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

#最直觀的思路

第一種方法是從頂至底的方法,這種方法的弊端是存在許多重複運算:

構造乙個獲取當前節點最大深度的方法 height(root),

通過比較此子樹的左右子樹的最大高度差abs(height(root.left) - height(root.right)),

來判斷此子樹是否是二叉平衡樹。

注意:若樹的所有子樹都平衡時,此樹才平衡。所以還需要判斷當前節點的子樹是否平衡

同時,若樹跟節點為空的話,則直接返回true

若不為空則就要判斷當前子樹是否平衡 and 當前子樹的左子樹是否平衡 and 當前子樹的右子樹是否平衡

height方法:用於計算樹的最大高度

終止條件:當node為空時,則返回高度0,說明當前樹已經遍歷完畢

返回值:返回左右子樹的最大高度+1

第二種方法是從底向上遍歷,若判斷出某子樹不是平衡樹,則直接返回-1,剩下的節點就不需要判斷了

假設當前節點 node 的左右子樹高度差<2,

則返回以node為根節點的子樹的最大高度,即max(self.height(node.left), self.height(node.right)) + 1

若當前節點node 左右子樹高度差 >= 2,則返回-1,代表此子樹不是平衡樹

最後主函式裡判斷返回值是否為-1,若為-1 則返回 fals,反之則為true

class solution:

def isbalanced(self, root: treenode) -> bool:

''' if not root:

return true

return abs(self.height(root.left) - self.height(root.right)) < 2 and self.isbalanced(root.left) and self.isbalanced(root.right)

def height(self, node):

if not node:

return 0

return max(self.height(node.left), self.height(node.right)) + 1

'''return self.ban(root)

!= -1

def ban(self, root):

if not root:

return 0

left = self.ban(root.left)

if left == -1:

return -1

right = self.ban(root.right)

if right == -1:

return -1

return max(left, right) + 1 if abs(left - right)

< 2 else -1

Evan的LeetCode刷題之路

二 資料庫 以此記錄本人的leetcode刷題之路。題目內容均 於leetcode 給定乙個整數陣列 nums 和乙個目標值 target,請你在該陣列中找出和為目標值的那兩個整數,並返回他們的陣列下標。你可以假設每種輸入只會對應乙個答案。但是,陣列中同乙個元素不能使用兩遍。示例 給定 nums 2...

leetcode刷題之路38 報數

報數序列是乙個整數序列,按照其中的整數的順序進行報數,得到下乙個數。其前五項如下 1.1 2.11 3.21 4.1211 5.111221 1 被讀作 one 1 乙個一 即 11。11 被讀作 two 1s 兩個一 即 21。21 被讀作 one 2 one 1 乙個二 乙個一 即 1211。給...

leetcode 刷題之路 22 Anagrams

given an array of strings,return all groups of strings that are anagrams.note all inputs will be in lower case.給出一組字串,要求返回是anagram 回文構詞法 的字元,回文構詞法的特徵是...