618 字
3 分钟
代码随想录算法训练营第十三天 | 二叉树 Part03

二叉树前序遍历(根-左-右)#

  • 一般用于需要先处理根节点的场景。
  • 典型应用:
    • 复制一棵树(先创建根节点,再递归复制子树)。
    • 序列化和反序列化二叉树。
    • 先序表达式计算。

二叉树中序遍历(左-根-右)#

  • 适合需要按顺序处理节点的场景。
  • 典型应用:
    • 二叉搜索树的排序,因为中序遍历得到的是排序后的节点值序列。
    • 验证一棵树是否为二叉搜索树(中序遍历结果是否单调递增)。
    • 构建有序数据结构。

二叉树后序遍历(左-右-根)#

  • 适合需要先处理子节点的场景。
  • 典型应用:
    • 删除一棵树(先删除子节点,再删除根节点,避免内存泄漏)。
    • 计算子树相关信息后再更新根节点,如计算树的高度、判断平衡性。
    • 表达式树的后缀表达式计算。

110. 平衡二叉树#

LeetCode 110. 平衡二叉树

class Solution:
# 因为处理子节点的场景,所以使用后序遍历
def isBalanced(self, root: Optional[TreeNode]) -> bool:
# 调用辅助函数获取高度,若返回-1表示不平衡
return self.get_height(root) != -1
def get_height(self, root):
if not root:
return 0
left = self.get_height(root.left)
if left == -1:
return -1
right = self.get_height(root.right)
if right == -1:
return -1
if abs(left - right) > 1:
return -1
else:
return max(left, right) + 1

257. 二叉树的所有路径#

LeetCode 257. 二叉树的所有路径

class Solution:
# 因为处理子节点的场景,所以使用后序遍历
def binaryTreePaths(self, root: Optional[TreeNode]) -> List[str]:
res = []
path = []
if not root:
return res
path.append(root.val)
self.traverse(root, path, res)
return res
def traverse(self, root, path, res):
# 到达叶子节点,路径加入结果
if not root.left and not root.right:
sPath = '->'.join(map(str, path))
res.append(sPath)
return
# 遍历左子树
if root.left:
path.append(root.left.val)
self.traverse(root.left, path, res)
path.pop()
# 遍历右子树
if root.right:
path.append(root.right.val)
self.traverse(root.right, path, res)
path.pop()

404. 左叶子之和#

LeetCode 404. 左叶子之和

class Solution:
# 处理子节点的场景,所以使用后序遍历
def sumOfLeftLeaves(self, root: Optional[TreeNode]) -> int:
if not root:
return 0
left = self.sumOfLeftLeaves(root.left)
# 判断左子节点是否为叶子节点
if root.left and not root.left.left and not root.left.right:
left = root.left.val
right = self.sumOfLeftLeaves(root.right)
sum_val = left + right
return sum_val

222. 完全二叉树的节点个数#

LeetCode 222. 完全二叉树的节点个数

class Solution:
# 因为处理子节点的场景,所以使用后序遍历
def countNodes(self, root: Optional[TreeNode]) -> int:
return self.traverse(root)
def traverse(self, root):
if not root:
return 0
left = self.traverse(root.left)
right = self.traverse(root.right)
sum_val = left + right + 1
return sum_val

代码随想录算法训练营第十三天 | 二叉树 Part03
https://fuwari.vercel.app/posts/code_musings_day_thirteen/
作者
Jarrett
发布于
2025-06-25
许可协议
CC BY-NC-SA 4.0