文档讲解:代码随想录
视频讲解:代码随想录B站账号
状态:看了视频题解和文章解析后做出来了
110.平衡二叉树
class Solution:
def isBalanced(self, root: Optional[TreeNode]) -> bool:
is_balance = True
height, is_balance = self.balance(root, is_balance)
return is_balance
def balance(self, node, is_balance):
if not node:
return 0, True
left_height, is_balance_left = self.balance(node.left, is_balance)
right_height, is_balance_right = self.balance(node.right, is_balance)
is_balance = left_is_balance and right_is_balance and abs(left_height - right_height) <= 1
return 1 + max(left_height, right_height), is_balance
思路:
step1:确定返回的参数为左右子树的最大深度,以及一个boolean variable判断是否平衡
step2:递归终止条件为node为空
step3:处理逻辑,依然沿用“二叉树的最大深度”那道题的后序递归方法,先调用左子树再调用右子树,然后更新is_balance变量。只有当左右子树及其它们的左右子树都为平衡二叉树,以及左子树和右子树的最大深度相差不大于1的时候,才是True,其余情况都为False。
这道题最重要的就是is_balance的更新逻辑,既能把前面的递归结果进行判断,又能判断当前节点是否为
257. 二叉树的所有路径
class Solution:
def traversal(self, cur, path, result):
path.append(cur.val)
if not cur.left and not cur.right:
result.append("->".join(map(str, path)))
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: Optional[TreeNode]) -> List[str]:
result = []
path = []
if not root:
return result
self.traversal(root, path, result)
return result
思路:这里用到了回溯的方法,用到回溯是因为在遍历的过程中,共享一个path变量,如果不回溯那么上一个递归里面的元素就会复用到下一个递归中。
所以在每次递归之后,需要加回溯的操作。
一个递归对应一个回溯,它们两个今生今世都不该被花括号分开。
404.左叶子之和
class Solution:
def sumOfLeftLeaves(self, root):
if root is None:
return 0
if root.left is None and root.right is None:
return 0
leftValue = self.sumOfLeftLeaves(root.left) # 左
if root.left and not root.left.left and not root.left.right: # 左子树是左叶子的情况
leftValue = root.left.val
rightValue = self.sumOfLeftLeaves(root.right) # 右
sum_val = leftValue + rightValue # 中
return sum_val