第六章二叉树part04
今日内容:110.平衡二叉树、 257. 二叉树的所有路径、 404.左叶子之和
代码随想录:代码随想录
二叉树解题三步:
1.明确递归函数的参数和返回值
2.明确终止条件
3.明确单层递归的逻辑
110.平衡二叉树
题意:给定一个二叉树,判断它是否是高度平衡的二叉树。
思路:主要是先理解题意,然后对题意进行拆分:主要实现两个功能,一个是得到左右子树的深度(输出为int),一个是根据深度判断深度是否相差1(输出为bool)。很好那就是写两个函数,一个实现深度输出,一个对二叉树进行遍历并判断是否平衡。
class Solution:
def isBalanced(self, root: Optional[TreeNode]) -> bool:
if root == None:
return True
leftdep = self.maxdepth(root.left)
rightdep = self.maxdepth(root.right)
rootjudge = False
if (leftdep - rightdep) >= -1 and (leftdep - rightdep) <= 1:
rootjudge = True
left = self.isBalanced(root.left)
right = self.isBalanced(root.right)
return True if rootjudge*left*right else False
def maxdepth(self, node):
if node == None:
return 0
left = self.maxdepth(node.left)
right = self.maxdepth(node.right)
if left > right: depth = left
else: depth = right
return 1 + depth
257. 二叉树的所有路径
题意:给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
思路:感觉这题是最难的,有一个回溯的思想,总结得出以下几点:
1.涉及按照某种顺序进行遍历并且根据条件输出的,可以用队列解题。
2.我认为这题最关键的思想是回溯。在队列的基础上,因为有的根节点会重复利用,所以意味着不是一次性的,而叶子节点进出一次队列后就用不到了,这个时候就有一个回溯的思想。很关键,需要理解理解!
class Solution:
def traversal(self, cur, path, result):
path.append(cur.val) # 中
if not cur.left and not cur.right: # 到达叶子节点
sPath = '->'.join(map(str, path))
result.append(sPath)
return
if cur.left: # 左
self.traversal(cur.left, path, result)
path.pop() # 回溯
if cur.right: # 右
self.traversal(cur.right, path, result)
path.pop() # 回溯
def binaryTreePaths(self, root):
result = []
path = []
if not root:
return result
self.traversal(root, path, result)
return result
404.左叶子之和
题意:计算给定二叉树的所有左叶子之和。
思路:感觉这题比上一题简单,思路和第一题差不多。就是拆分题意,后得出先判断是否是左叶子,如果是就加上val值,然后遍历。
class Solution:
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
if root == None:
return 0
left = self.sumOfLeftLeaves(root.left)
right = self.sumOfLeftLeaves(root.right)
sumleft = self.isleftleaves(root.left)
return sumleft + left + right
def isleftleaves(self, node):
if node == None:
return 0
if node.left == None and node.right == None:
return node.val
else:
return 0