二叉树前中后序递归法

133 阅读1分钟

前序遍历(中左右)

graph TD
前序遍历 --> 中
前序遍历 --> 左
前序遍历 --> 右

中序遍历(左中右)

graph TD
中序遍历 --> 左
中序遍历 --> 中
中序遍历 --> 右

后序遍历(左右中)

graph TD
后序遍历 --> 左
后序遍历 --> 右
后序遍历 --> 中

可以将前中后映射为左中右,先左后右的单向顺序是固定的,前序遍历即在中间,中序即在中间,后序即在中间

以前序遍历为例

题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历

1、确定递归函数的参数和返回值

题目要求打印出遍历结果,因此,递归函数的参数除了二叉树根节点,还需要有一个数组

const traversal = (root, arr) => {}

2、确定终止条件

在递归的过程中,当前遍历的节点是空了,那么本层递归就要要结束了,直接return,代码如下:

if (!root) return

3、确定单层递归的逻辑

前序遍历是中左右的循序,所以在单层递归的逻辑,是要先取中节点的数值,代码如下:

arr.push(root.val) // 中
traversal(root.left, arr) // 左
traversal(root.right, arr) // 右

完整代码:

const traversal = (root, arr) => {
    if (!root) return
    arr.push(root.val) // 中
    traversal(root.left, arr) // 左
    traversal(root.right, arr) // 右
}
const arr = []
traversal(root, arr)
return arr

举一反三,中序遍历、后序遍历只需要调整单层递归逻辑

//中序遍历
const traversal = (root, arr) => {
    if(!root) return
    traversal(root.left, arr) // 左
    arr.push(root.val) // 中
    traversal(root.right, arr) // 右
}
const arr = []
traversal(root, arr)
return arr

//后序遍历
const traversal = (root, arr) => {
    if(!root) return
    traversal(root.left, arr) // 左
    traversal(root.right, arr) // 右
    arr.push(root.val) // 中
}
const arr = []
traversal(root, arr)
return arr

参考:「代码随想录」彻底吃透前中后序递归法(递归三部曲)