給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義為:
乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過 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 回文構詞法 的字元,回文構詞法的特徵是...