O:前言
关于二叉树的题,大部分都是用递归实现的,代码量少,思路清晰,当然会存在递归深度过深而导致的时间损耗或重复计算等问题,关于二叉树的题,可以加深我们对递归的理解。我也会尝试用非递归代码实现,其中有些题是我copy他人优秀解答代码的,希望理解,能力有限,大家共同学习,共同进步!
一. 难度:简单
1.1 二叉树
104:二叉树的最大深度
- 题目描述
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。 - 例子
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回它的最大深度3
- 递归实现
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
return 1 + max(self.maxDepth(root.left), self.maxDepth(root.right))
- 非递归实现(深度优先搜索)
class Solution:
def maxDepth(self, root: TreeNode) -> int:
if not root:
return 0
self.max_d = 0
self.dfs(root,0)
return self.max_d
def dfs(self, node: TreeNode, level: int) -> int:
if not node:
if self.ans < level:
self.ans = level
return
self.dfs(node.left,level+1)
self.dfs(node.right,level+1)
111. 二叉树的最小深度
- 题目描述
给定一个二叉树,找出其最小深度。
最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。 - 例子
给定二叉树 [3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回它的最小深度2
- 递归实现
class Solution:
def minDepth(self, root: TreeNode) -> int:
if root:
if root.left and root.right:
return 1+min(self.minDepth(root.left),self.minDepth(root.right))
elif root.left:
return 1+self.minDepth(root.left)
elif root.right:
return 1+self.minDepth(root.right)
else:
return 1
else:
return 0
- 非递归实现(深度优先搜索)
class Solution:
def minDepth(self, root: TreeNode) -> int:
if root == None:
return 0
self.ans = float("inf")
self._dfs(root, 0)
return self.ans
def _dfs(self, node, level):
if node == None:
return
if node.left == None and node.right == None:
if self.ans > level+1:
self.ans = level + 1
return
self._dfs(node.left, level + 1)
self._dfs(node.right, level + 1)
101. 对称二叉树
- 题目描述
给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个[1,2,2,null,3,null,3],则不是对称的
1
/ \
2 2
\ \
3 3
- 层次遍历
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
# 检查每一层是否是回文
queue = [root]
while queue != []:
next_queue,each_layer = [],[]
for node in queue:
if node == None:
each_layer.append(None)
continue
next_queue.append(node.left)
next_queue.append(node.right)
each_layer.append(node.val)
if each_layer != each_layer[::-1]:
return False
queue = next_queue
return

这篇博客详细介绍了LeetCode中关于二叉树和树形结构的问题,涵盖最大深度、最小深度、对称性检查、翻转、路径和等挑战,包括简单的递归和非递归解决方案。博主分享了学习二叉树问题的心得,旨在加深对递归的理解,同时提供了多道题目解题思路和代码实现。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



