前言
将用 递归 和 迭代 来解这道题,这两种本质都是用栈,递归隐式的用了栈,而迭代将显示用栈。
一、题目描述
leetcode地址
git代码
给你二叉树的根节点 root ,返回它节点值的 前序遍历。
前序遍历的顺序是根节点、左子树、右子树,其属于深度遍历的一种。
二、解题
2.1 迭代法
2.1.1 思路
- 迭代 + 栈
- 迭代继续条件:栈不为空
- 栈是后进先出,故要先压右子树,再压左子树
2.1.2 图解
自己画的图,大家将就看,配合下面的解释以及代码看,很容易理解的。
根节点压栈,接着出栈,出栈的同时,把当前节点的值添加到输出结果中,并让当前节点的右子树、左子树依次压栈。
2.1.3 代码
const preorderTraversal = function (root) {
// 如果根节点为空,就不用遍历了
if(root === null) return []
// res用来储存遍历结果
const res = []
// 模拟栈
const stack = [root]
// 迭代继续的条件stack不为空
while(stack.length > 0) {
// 当前节点
const cur = stack.pop()
// 把当前节点的值加入到res中
res.push(cur.val)
// 如果当前节点有右子树,则入栈
cur.right && stack.push(cur.right)
// 如果当前节点有左子树,则入栈
cur.left && stack.push(cur.left)
}
return res
}
2.2 递归法
此方法其实没什么好说的,上面的迭代方法能看懂。这个方法就能懂。因为递归就是隐式的用栈
const preorderTraversal = function (root) {
const res = []
// 真正的递归过程
const perorder = function(res, root) {
// 迭代结束的条件
if(root === null) return
res.push(root.val)
root.left && perorder(res,root.left)
root.right && perorder(res,root.right)
}
perorder(res, root)
return res
}