一、平衡二叉树
1.1 题目
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4] 输出:false
示例 3:
输入:root = [] 输出:true
提示:
- 树中的节点数在范围
[0, 5000]
内 -10^4 <= Node.val <= 10^4
1.2 题目链接
1.3 解题思路与过程想法
(1)解题思路
# 统计树的高度,最简便的方式就是利用后序遍历
# 但需在统计高度的同时,记录该树是否是平衡二叉树
# 若不是,则返回高度为-1,否则正常统计树的高度
(2)过程想法
稍加修改的递归题,需会辨别并做出
1.4 代码
class Solution:
def height(self,root) -> int:
if not root:
return 0
# 左
l = self.height(root.left)
if l == -1:
return -1
# 右
r = self.height(root.right)
if r == -1:
return -1
# 根
if abs(l - r) > 1:
return -1
else:
return max(l,r) + 1
def isBalanced(self, root: Optional[TreeNode]) -> bool:
# 统计树的高度,最简便的方式就是利用后序遍历
# 但需在统计高度的同时,记录该树是否是平衡二叉树
# 若不是,则返回高度为-1,否则正常统计树的高度
if self.height(root) == -1:
return False
else:
return True
二、二叉树的所有路径
2.1 题目
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
示例 1:
输入:root = [1,2,3,null,5] 输出:["1->2->5","1->3"]
示例 2:
输入:root = [1] 输出:["1"]
提示:
- 树中节点的数目在范围
[1, 100]
内 -100 <= Node.val <= 100
2.2 题目链接
2.3 解题思路与过程想法
(1)解题思路
# 使用前序遍历递归:根左右
# 找到叶子节点,进出处理--->回溯向上--->判断其他分支节点
(2)过程想法
思考过程中有想过回溯,但对回溯不是很熟。
2.4 代码
class Solution:
def TreePath(self,root,path,res):
# 使用前序遍历递归:根左右
# 找到叶子节点,进出处理--->回溯向上--->判断其他分支节点
# 根
path.append(root.val)
# 递归出口:递归到叶子节点,处理 path 中的内容,将前者加入 res
if not root.left and not root.right:
# map函数将path列表中的每个元素转换为字符串类型
pathS = '->'.join(map(str,path))
res.append(pathS)
# 左
if root.left:
self.TreePath(root.left,path,res)
# 回溯:否则无法往上退出,去遍历其他分支节点
path.pop()
# 右
if root.right:
self.TreePath(root.right,path,res)
# 回溯:否则无法往上退出,去遍历其他分支节点
path.pop()
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
res = []
path = []
if not root:
return res
else:
self.TreePath(root,path,res)
return res
三、左叶子之和
3.1 题目
给定二叉树的根节点 root
,返回所有左叶子之和。
示例 1:
输入: root = [3,9,20,null,null,15,7] 输出: 24 解释: 在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24
示例 2:
输入: root = [1] 输出: 0
提示:
- 节点数在
[1, 1000]
范围内 -1000 <= Node.val <= 1000
3.2 题目链接
3.3 解题思路与过程想法
(1)解题思路
# 使用后序递归遍历来计算左叶子的数量
# 左叶子的判断:左指针的左右指针都为空
# 两层的小树中,只有左子树中才会出现左叶子节点
(2)过程想法
稍加修改的递归题,需会辨别并做出
3.4 代码
class Solution:
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
# 使用后序递归遍历来计算左叶子的数量
l = 0
r = 0
# 递归出口:当前节点为空,或其没有左右子树
if not root:
return 0
if not root.left and not root.right:
return 0
# 左
if root.left:
l = self.sumOfLeftLeaves(root.left)
# 左子树是左叶子的情况
if root.left and not root.left.left and not root.left.right:
l = root.left.val
# 右
if root.right:
r = self.sumOfLeftLeaves(root.right)
# 根
return l + r