[路飞]_二叉树的前序遍历

578 阅读1分钟

leetcode-144 二叉树的前序遍历
b站视频

题目介绍

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

示例1

image.png

输入: root = [1,null,2,3]
输出: [1,2,3]

示例2

输入: root = []
输出: []

示例3

输入: root = [1]
输出: [1]

示例4

image.png

输入: root = [1,2]
输出: [1,2]

示例5

image.png

输入: 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
}

迭代

迭代法主要是利用栈的思想,步骤如下

  1. 维护两个数组,一个是最后的结果数组 ans, 一个是存放节点的数组 treeNodeArr,一开始先将根节点放到 treeNodeArr
  2. treeNodeArr 数组不为空时,每次将 treeNodeArr 的第一个节点从数组中弹出,然后将该节点的值 push 到结果数组中
  3. 如果当前节点有右节点,则将右节点从 treeNodeArr 的前面插入;如果当前节点有左节点,则将左节点从 treeNodeArr 的前面插入
  4. 重复 2-3 的步骤,直到 treeNodeArr 数组为空,返回 ans 数组即为最终结果

1.gif

解题代码

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
};