前端算法小白攻略40-leetcode(二叉树的前序遍历)

96 阅读2分钟

「这是我参与2022首次更文挑战的第23天,活动详情查看:2022首次更文挑战

前言

前面我们了解过二叉树的前序遍历-验证二叉树的前序序列化,今天我们实战二叉树的前序遍历,分别用简单的递归法以及进阶的迭代法求解。

题目描述

144. 二叉树的前序遍历

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

image.png

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

解题思路

递归法思路:

我们需要一个数组来存放节点值,和一个给结果数组push值的转换方法transfer,在transfer函数里递归调用它本身即可

迭代法思路:

我们需要一个存取节点的栈,一个放节点值的数组,先把根节点入栈,然后进入循环取存栈节点给结果数组push值的过程,每次从栈中pop节点出来及每次使用栈顶元素,把节点值放入结果数组,用完之后把符合前序遍历顺序的节点入栈,然后继续下一层循环,直到栈中无节点可用

开始解题

递归法解题:

var preorderTraversal = function(root) {
    let resArr = [];
    travese(root,resArr);  // 从根节点启动节点到节点值数组的转换函数
    return resArr;
};

var travese = function(root,resArr) {
    if(!root) return null;
    // 可以从大的结构分步,先放根节点,再递归处理左-右子树
    resArr.push(root.val);
    travese(root.left, resArr);
    travese(root.right, resArr);
}

迭代法解题:

var preorderTraversal = function(root) {
    if(!root) return [];
    
    let stack = [root];  // 栈中第一个要处理的就是根节点
    let resArr = [];

    while(stack.length) {
        const current = stack.pop(); // 每次处理栈顶节点
        resArr.push(current.val);

        // 因为每次处理的栈顶节点,所以按照前序遍历根左右的顺序下次要处理左节点,
        // 所以要先push右节点,再push左节点,这样左节点就在栈顶了
        current.right && stack.push(current.right);
        current.left && stack.push(current.left);
    }

    return resArr;
};