[路飞]算法:589. N 叉树的前序遍历

120 阅读1分钟

589. N 叉树的前序遍历

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

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

示例 1:

image.png

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

示例 2:

image.png

解析

该算法是基于 二叉树的前序遍历 的一个拓展,关于二叉树的前序遍历可以参考前文:二叉树的前序遍历.

二叉树前序遍历通过堆栈去解决,同样的 N 叉树的前序遍历还是使用相同的解决方案,不同的是各个节点的子树有可能大于等于2,那么我们可以先假设这是一个二叉树,先去实现前序遍历:

 var preorder = function(root) {
     let res = [] // 用来接收结果的数组
     const stack = root ? [root] : [] // 将根节点放入栈中
     while(stack.length) { // 取栈
         const node = stack.pop() // 取栈顶节点
         // 倒序压入栈中
         node.right? stack.push(node.right) : '' 
         node.left ? stack.push(node.left) : ''
         res.push(node.val) // 更新结果
     }
 }

此时 res结果数组中保存的就是前序遍历的结果。

将算法应用到N叉树中,所不同之处在于不局限于 node.leftnode.right ,而是一个数组,那么我们直接将取子节点的部分替换掉即可。

完整代码:

/**
 * @param {Node|null} root
 * @return {number[]}
 */
var preorder = function(root) {
    let res = []
    const stack = root ? [root] : []
    while(stack.length) {
        const node = stack.pop()
        for (let index = node.children.length - 1 ; index >= 0; index--) {
            stack.push(node.children[index])
        }
        res.push(node.val)
    } 
    return res
};