589. N 叉树的前序遍历
给定一个 N 叉树,返回其节点值的 前序遍历 。
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
进阶:
递归法很简单,你可以使用迭代法完成此题吗?
示例 1:
输入: 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]
提示:
- N 叉树的高度小于或等于
1000 - 节点总数在范围
[0, 10^4]内**
递归法
使用递归的方式,就能思路非常清晰的得到题解
- 首先处理边界条件root无效直接返回[]
- 在内部声明一个递归函数处理没一个节点preorderNode
递归的逻辑:
如果传入的节点无效直接return
将每个节点的值放入res结果集合中
顺序遍历结果的children,对每一个children中的节点再次调用递归函数preorderNode来处理
思路
/**
* // Definition for a Node.
* function Node(val, children) {
* this.val = val;
* this.children = children;
* };
*/
/**
* @param {Node|null} root
* @return {number[]}
*/
var preorder = function(root) {
var res = []
if(!root) return res
var preorderNode = function(node){
if(!node) return
res.push(node.val)
var children = node.children
for(var i = 0;i<children.length;i++){
var item = children[i]
preorderNode(item)
}
}
preorderNode(root)
return res
};
迭代法
思路
- 用迭代的方式去遍历每一层的话我们就需要使用深度优先遍历
顺序
通过一个stack来放入每一层的节点,因为是前序遍历,顺序为根节点->第一个子节点的前序->第二个子节点的前序...,所以我们往stack中存放数据的时候就要保证前序遍历的顺序
方案
-
处理边界条件,root无效直接返回[]
-
我们通过pop从stack的尾部获取节点,所以遍历每一层的children的元素时,需要倒序的方式,stack中push节点,这样在下次pop的时候就能拿到最左边的第一个节点,达到深度优先的目的
-
历的过程中将每stack中取到的值放入res中即可得到结果
/**
* // Definition for a Node.
* function Node(val, children) {
* this.val = val;
* this.children = children;
* };
*/
/**
* @param {Node|null} root
* @return {number[]}
*/
var preorder = function(root) {
var res = []
if(!root) return res
var stack = [root]
while(stack.length){
var item = stack.pop()
res.push(item.val)
var children = item.children
for(var i = children.length-1;i>=0;i--){
var item = children[i]
if(item) stack.push(item)
}
}
return res
};