Skip to the content.

树的递归问题

在数据结构中,我们对树的学习主要讨论其两种遍历:

  1. 深度优先遍历法-前中后序遍历
  2. 广度优先遍历法

而前中后序遍历可以很简单的用递归写成如下形式:

type TreeNode struct {
	Val   int
	Left  *TreeNode
	Right *TreeNode
}

// 前序遍历
func preOrder(root *TreeNode) {
    if root == nil
        return
    // 真实的处理逻辑
    process(root)
    preOrder(root.left)
    preOrder(root.right)
}

// 中序遍历
func preOrder(root *TreeNode) {
    if root == nil
        return
    preOrder(root.left)
    // 真实的处理逻辑
    process(root)
    preOrder(root.right)
}

// 后序遍历
func preOrder(root *TreeNode) {
    if root == nil
        return
    preOrder(root.left)
    preOrder(root.right)
    // 真实的处理逻辑
    process(root)
}

通常情况下我们只需要对process(root *TreeNode)函数进行修改就可以了。对于树的遍历类问题,我们需要思考两个问题:

  1. 采用哪种遍历方式?
  2. 处理逻辑怎么写?

例如下列题目:

  1. 104. 二叉树的最大深度
  2. 236. 二叉树的最近公共祖先