前言
本文最重要的就是帮助理解何为递归,以及在二叉树前、中、后序遍历问题中,递归的实现原理与过程。
递归
简单来说,递归函数就是通过自己调用自己来实现某种功能的函数。
递归可以类比成数学上的递推过程:
对于斐波那契数列的推导过程,我们既有边界条件:f(1)=1,f(2)=1;我们又有调用关系:f(n) = f(n-1) + f(n-2)。
一般来说,递归函数也具有这两个特点:①存在边界条件,保证不会陷入无限循环中;②明确调用关系,用来具体执行小任务。
二叉树的前序遍历问题
我们结合二叉树的三种遍历来理解递归。
首先是二叉树的前序遍历。
题解代码:
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
# 定义一个内部函数,用于递归遍历
def traverse(node, res):
if node is None:
return
res.append(node.val)
traverse(node.left, res)
traverse(node.right, res)
# 初始化一个空列表,用于存储结果
res = []
# 调用内部函数,传入根节点和结果列表
traverse(root, res)
# 返回结果列表
return res
其他两种遍历
当我们用递归函数来解决二叉树的三种遍历的时候,思路是一致的,我们可以微调代码而直接实现效果。
中序遍历代码:
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
def in_order_recur(node,res):
if node is None: return
in_order_recur(node.left,res)
res.append(node.val)
in_order_recur(node.right,res)
in_order_recur(root,res)
return res
后序遍历代码:
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
def post_order_recur(node,res):
if node is None: return []
post_order_recur(node.left, res)
post_order_recur(node.right, res)
res.append(node.val)
post_order_recur(root, res)
return res