[路飞]_前端算法第六十弹-N 叉树的前序遍历

97 阅读1分钟

给定一个 N 叉树,返回其节点值的 前序遍历

N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。

进阶:

递归法很简单,你可以使用迭代法完成此题吗?

示例 1:

https://assets.leetcode.com/uploads/2018/10/12/narytreeexample.png

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

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]

递归方法

进阶提示里写的递归法很简单,那我们直接来看这种简单方法。

我们只需要一次对root的children进行遍历即可。

var preorder = function(root,ans=[]) {
    if(!root) return [];
    ans.push(root.val)
    for(const child of root.children){
        preorder(child,ans)
    }
    return ans
};

迭代方法

迭代方法我们需要用到栈来帮我们进行前序遍历,需要保证栈顶元素是我们当前需要遍历的结点。

我们先将根节点入栈,因为根节点是前序遍历的第一个节点,随后我们每次取出栈顶元素node,他是我们当前需要遍历的结点,将当前元素的值记录,并将其子结点逆序入栈。这样我们可以保证下一次出栈的是第一个子结点。

var preorder = function (root) {
    let res = [];
    if (!root) return res;
    let stack = [];
    stack.push(root);
    while (stack.length != 0) {
        let node = stack.pop();
        res.push(node.val);
        node.children.reverse()
        stack.push(...node.children)
    }
    return res;
};