*110.平衡二叉树
题目链接/文章讲解/视频讲解:https://programmercarl.com/0110.%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91.html
- 考点
- 后序遍历+二叉树高度计算
- 我的思路
- 错误地将平衡二叉树的定义等价为判断整体二叉树的最大深度和最小深度之差是否大于1
- 视频讲解关键点总结
- 实际上本题应从最低层左右子树开始判断,若左右子树的高度差大于1,则不是平衡二叉树
- 因此,使用后序遍历计算二叉树的高度
- 递归三要素
- 形参为节点,返回值为0(代表遍历到了空节点)/ -1(代表左右子树不平衡) / 当前节点的高度
- 退出条件:若当前节点为空,则return 0
- 递归逻辑
- 后序遍历,左右中
- 首先计算左子树的高度
- 再计算右子树的高度
- 最后判断是否平衡
- 我的思路的问题
- 见上
- 代码书写问题
- 无
- 可执行代码
class Solution:
def pro(self, root):
if root is None:
return 0
left_height = self.pro(root.left)
if left_height == -1:
return -1
right_height = self.pro(root.right)
if right_height == -1:
return -1
if abs(left_height - right_height) > 1:
return -1
else:
return 1 + max(left_height, right_height)
def isBalanced(self, root: Optional[TreeNode]) -> bool:
if root is None:
return True
if self.pro(root) == -1:
return False
else:
return True
*257. 二叉树的所有路径
题目链接/文章讲解/视频讲解:https://programmercarl.com/0257.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E6%89%80%E6%9C%89%E8%B7%AF%E5%BE%84.html
- 考点
- 递归+回溯
- 我的思路
- 无
- 视频讲解关键点总结
- 递归三要素
- 形参包括:当前节点,路径字符串,结果列表;返回值为空
- 退出条件:当前节点为叶子节点时,将当前路径字符串加入结果列表中,并返回
- 递归逻辑
- 前序遍历,中左右
- 在退出条件之上,把当前节点的值加入路径字符串中(为了避免退出递归时遗漏叶子节点)
- 如果左节点不为空,递归左子节点;递归完左子节点后执行回溯语句(一定是一个递归对应一个回溯),把路径字符串中的最后一个节点删除
- 如果右节点不为空,递归右子节点;递归完右子节点后执行回溯语句(一定是一个递归对应一个回溯),把路径字符串中的最后一个节点删除
- 递归三要素
- 我的思路的问题
- 无思路
- 代码书写问题
- 无
- 可执行代码
class Solution:
def traversal(self, root, path, result):
path.append(str(root.val))
if root.left is None and root.right is None:
result.append('->'.join(path))
return
if root.left:
self.traversal(root.left, path, result)
path.pop()
if root.right:
self.traversal(root.right, path, result)
path.pop()
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
if root is None:
return []
path = []
result = []
self.traversal(root, path, result)
return result
404.左叶子之和
题目链接/文章讲解/视频讲解:https://programmercarl.com/0404.%E5%B7%A6%E5%8F%B6%E5%AD%90%E4%B9%8B%E5%92%8C.html
- 考点
- 前序遍历
- 审题(左叶子节点的定义)
- 我的思路
- 递归三要素
- 形参:当前节点,标志位(用来标记当前是否为左节点);无返回值
- 退出条件:当前节点为空则退出
- 递归逻辑:
- 如果标志位为1(代表左节点)且当前节点无子节点(即当前节点为叶子节点),则把当前节点的值加到和值中(和值初始化为Solution类的属性)
- 左子结点递归(标志位为1)
- 右子节点递归(标志位为0)
- 递归三要素
- 视频讲解关键点总结
- 没具体看,使用的思路和我大致相仿,但代码逻辑有所区别
- 我的思路的问题
- 无
- 代码书写问题
- 无
- 可执行代码
class Solution:
def __init__(self):
self.summation = 0
def sum_left(self, root, flag):
if root is None:
return 0
if flag == 1 and root.left is None and root.right is None:
self.summation += root.val
self.sum_left(root.left, 1)
self.sum_left(root.right, 0)
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
self.sum_left(root, 0)
return self.summation