文章目录
104. Maximum Depth of Binary Tree
题目:给定一棵二叉树,返回最大深度
方法一:递归,运行40ms
class Solution(object):
def maxDepth(self, root):
if not root: return 0
return 1 + max(self.maxDepth(root.left),self.maxDepth(root.right))
方法二:层次遍历,运行28ms
class Solution(object):
def maxDepth(self, root):
depth = 0
level = [root] if root else [] # 记录每一层的节点
while level:
depth += 1
level = [kid for n in level for kid in (n.left,n.right) if kid]
return depth
111. Minimum Depth of Binary Tree
题目:给定一棵二叉树,返回最小深度
方法一:Wrong answer
像求最大深度一样写,返回的是左右子树的最小深度,但是这样是错误的
考虑特殊情况:当二叉树是一条链时,最小深度就是链长,而不是为1
class Solution(object):
def maxDepth(self, root):
if not root: return 0
return 1 + min(self.maxDepth(root.left),self.maxDepth(root.right))
方法二:改进以上方法
class Solution(object):
def minDepth(self, root):
if not root: return 0
if not root.left: return self.minDepth(root.right) + 1
if not root.right: return self.minDepth(root.left) + 1
return min(self.minDepth(root.left), self.minDepth(root.right)) + 1
110. Balanced Binary Tree
题意:判断一棵树是否为平衡二叉树,平衡二叉树的定义为:对于树中的每一个节点,左右子树的高度都相差不超过1.
方法一:暴力求解每个节点的左右子树的高度,O(N^2)
class Solution(object):
def isBalanced(self, root):
def dfs(root): # 求一棵树的最大深度,本篇博客的第一道题。
if not root: return 0
return 1 + max(dfs(root.left), dfs(root.right)) # 相当于一个递归栈,每次返回都+1
if not root: return True
left = dfs(root.left)
right = dfs(root.right)
return abs(left - right) <=1 and self.isBalanced(root.left) and self.isBalanced(root.right) # 递归判断子节点
方法二:后序遍历,自底向上判断
def isBalanced(self, root):
def dfs(root): # 定义为以root为根的树,返回左右子树的最大高度
if not root: return 0
left = dfs(root.left) # 左子数的高度
right = dfs(root.right) # 右子树的高度
if abs(left - right) > 1:
self.isBalanced = False
return 1 + max(left, right) # 自底向上来遍历节点
self.isBalanced = True
dfs(root)
return self.isBalanced
8565

被折叠的 条评论
为什么被折叠?



