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

136 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述

leetcode144. 二叉树的前序遍历

给你二叉树的根节点 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

二、思路分析

1. 递归

特点:无需展开理解,不在乎实现过程,利用递归函数的语意信息去进行程序设计。

前序遍历按照根-左子树-右子树的方式遍历这个树。

  • 递归函数 preorder,目的就是遍历root为根节点的二叉树
  • 考虑边界条件,root为空时无需遍历
  • 以根-左-右的方式,遍历左子树和右子树。

2. 迭代

迭代实现与递归是等价的,递归的时候隐式地维护了一个栈,而我们在迭代的时候需要显式地将这个栈模拟出来

  • 定义一个 stack 模拟栈
  • 栈的特点 先进后出
  • 初始root进栈,如果root不为空,先处理左子树,如果没有左孩子了,那么root为空,取栈顶元素,然后处理右孩子;

三、JavaScript代码


/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[]}
 */
// 递归
function preorder(root, ans){
    if(root == null) return;
    ans.push(root.val);
    preorder(root.left, ans);
    preorder(root.right, ans)
}
var preorderTraversal = function(root) {
    let ans = [];
    preorder(root,ans);
    return ans
};

// 迭代
var preorderTraversal = function(root) {
    let res = [],
    stack = [];
    while (stack.length || root) {
        while (root) {
            res.push(root.val);
            stack.push(root);
            root = root.left;
        }
        // 栈的特点-取栈顶元素,
        root = stack.pop();
        root = root.right;
    }
    return res;
};

四、总结