题目介绍
给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
示例1
输入: root = [1,null,2,3]
输出: [1,2,3]
示例2
输入: root = []
输出: []
示例3
输入: root = [1]
输出: [1]
示例4
输入: root = [1,2]
输出: [1,2]
示例5
输入: root = [1,null,2]
输出: [1,2]
提示:
- 树中节点数目在范围
[0, 100]内 -100 <= Node.val <= 100进阶: 递归算法很简单,你可以通过迭代算法完成吗?
解题思路
递归
递归方法很简单,先将根节点 push 到结果数组中,然后递归调用左子树,递归调用右子树就可以了
解题代码
var preorderTraversal = function(root) {
const ans = []
preorder(root, ans)
return ans
};
var preorder = function(root, ans) {
if (!root) return
ans.push(root.val)
preorder(root.left, ans)
preorder(root.right, ans)
return ans
}
迭代
迭代法主要是利用栈的思想,步骤如下
- 维护两个数组,一个是最后的结果数组
ans, 一个是存放节点的数组treeNodeArr,一开始先将根节点放到treeNodeArr中 - 当
treeNodeArr数组不为空时,每次将treeNodeArr的第一个节点从数组中弹出,然后将该节点的值push到结果数组中 - 如果当前节点有右节点,则将右节点从
treeNodeArr的前面插入;如果当前节点有左节点,则将左节点从treeNodeArr的前面插入 - 重复
2-3的步骤,直到treeNodeArr数组为空,返回ans数组即为最终结果
解题代码
var preorderTraversal = function(root) {
if (!root) return []
const ans = []
const treeNodeArr = [root]
while (treeNodeArr.length) {
const node = treeNodeArr.shift()
node.right && treeNodeArr.unshift(node.right)
node.left && treeNodeArr.unshift(node.left)
ans.push(node.val)
}
return ans
};