589. N 叉树的前序遍历
给定一个 N 叉树,返回其节点值的 前序遍历 。
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null
分隔(请参见示例)。
示例 1:
输入: root = [1,null,3,2,4,null,5,6]
输出: [1,3,5,6,2,4]
示例 2:
解析
该算法是基于 二叉树的前序遍历
的一个拓展,关于二叉树的前序遍历可以参考前文:二叉树的前序遍历.
二叉树前序遍历通过堆栈去解决,同样的 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.left
和 node.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
};