一、题目描述
给定一个二叉树,返回它的 中序 遍历。
示例:
输入:[1, null, 2, 3]
1
\
2
/
3
输出:[1, 3, 2]
进阶: 递归算法很简单,你可以通过迭代算法完成吗?
二、思路分析
这道题只要你了解树的中序遍历就可以直接做了,没有其他什么弯弯绕绕的东西。
注: 中序遍历的意思为 先遍历树的左子树再遍历根节点最后遍历右子树
三、AC 代码
递归版
var inorderTraversal = function(root) {
const res = [] // 需要返回的数组
// 递归函数
const callback = (data) => {
if(!data) return // 边界判断
callback(data.left) // 先遍历左子树
res.push(data.val) // 再遍历根节点
callback(data.right) // 最后遍历右子树
}
callback(root)
return res
}
迭代版
var inorderTraversal = function(root) {
const res = []
const stack = [] // 栈
let p = root // 指针 初始指向 root
// 当栈 和 指针有值的时候执行代码块的内容
while(stack.length || p) {
// 当 指针 有值的时候执行代码块的内容
while(p) {
stack.push(p) // 把当前指针的值推入栈
p = p.left // 指针指向原指针节点的 left 因为要优先把所有 左子树遍历
}
const data = stack.pop() // 当指针没值的时候从 栈 中 出栈 一个节点
res.push(data.val) // 保存节点的值 (遍历 根节点)
p = data.right // 指针指向 右子树 (遍历 右子树)
}
return res
}
四、总结
递归版本非常的简单,只要了解中序遍历的特征基本上就能做出来。
但是迭代版就稍微有点麻烦了,首先需要一个指针来不断的遍历 左子树 并把遍历的每个节点推入 栈 中,当一个节点没有左子节点的时候就出栈这个节点获取它的值并且把指针指向右子节点来遍历右子树
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情