一、LeetCode110. 平衡二叉树
1:题目描述(110. 平衡二叉树)
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
2:解题思路
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isBalanced(self, root: Optional[TreeNode]) -> bool:
# 递归法
def balanced(node):
if node == None:
return 0 # 节点为空,返回节点高度为0
node_left = balanced(node.left) # 获取左子树的高度
if node_left == -1: return -1 # 如果左子树的高度为-1,则向上层节点返回-1,表示不是平衡二叉树
node_right = balanced(node.right) # 获取右子树的高度
if node_right == -1: return -1 # 如果右子树的高度为-1,则向上层节点返回-1,表示不是平衡二叉树
result = 0
if abs(node_left - node_right) > 1: # 当左右子树的高度差的绝对值大于1,表示不是平衡二叉树,向上层节点返回-1
result = -1
else:
# 当左右子树的高度差的绝对值小于等于1,表示是平衡二叉树,向上层节点返回节点的高度
result = 1 + max(node_left, node_right)
return result
res = balanced(root)
if res == -1:
return False
else:
return True
二、LeetCode257. 二叉树的所有路径
1:题目描述(257. 二叉树的所有路径)
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
2:解题思路
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
def treepath(node, res, result):
# 递归
# 使用前序遍历
# 先将当前节点加入到路径中,及中间节点
res.append(str(node.val))
if node.left == None and node.right == None: # 当节点没有左右子节点时,说明就是叶子节点了
# print(res)
s = "->".join(res) # 将存储路径节点,转化为中间使用“->”连接的字符串
result.append(s) # 将路径加入到最终输出的列表中
# 再遍历节点的左节点
if node.left:
treepath(node.left, res, result)
# 当遍历完左节点后,需要将遍历过的节点弹出,及回溯到上一个节点
# 方便进行下一个路径的遍历
res.pop()
# 遍历节点的右节点
if node.right:
treepath(node.right, res, result)
# 当遍历完右节点后,需要将当前节点下的节点进行弹出,及回溯到上一个节点
# 方便进行下一个路径的遍历
res.pop()
return result
res = []
result = []
if not root:
return result
results = treepath(root, res, result)
return results
三、LeetCode404. 左叶子之和
1:题目描述(404. 左叶子之和)
给定二叉树的根节点 root
,返回所有左叶子之和。
2:解题思路
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
# 递归
# 使用后序遍历-左右中
# 用父节点来统计它下面的左叶子节点,当父节点的左节点不为空,左节点的左右子节点为空,说明左节点是个左叶子节点
if root == None:
return 0 # 节点为空,不存在左叶子节点
if root.left == None and root.right == None:
return 0 # 节点的左右子节点均为空,说明节点是叶子节点,但不是确定是左叶子节点,因为使用父节点来统计左叶子节点,所以返回0
left_sum = self.sumOfLeftLeaves(root.left) # 求左子树的左叶子节点数的总和
if root.left != None and root.left.left == None and root.left.right == None:
left_sum += root.left.val # 当父节点的左节点不为空,左节点的左右子节点为空,说明左节点是个左叶子节点
right_sum = self.sumOfLeftLeaves(root.right) # 求右子树的左叶子节点数的总和
return left_sum + right_sum # 左子树的左叶子节点+右子树的左叶子节点总和