题目介绍 给定一个 N 叉树,返回其节点值的 前序遍历 。
N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
进阶:
递归法很简单,你可以使用迭代法完成此题吗?
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/n-… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
1.递归法,传入根节点,然后遍历子树数组,把子树节点传入递归调用
代码
/**
* // Definition for a Node.
* function Node(val, children) {
* this.val = val;
* this.children = children;
* };
*/
/**
* @param {Node|null} root
* @return {number[]}
*/
var preorder = function(root) {
let arr = []
function preorderFn(root) {
if (!root) return
arr.push(root.val)
if (root.children) {
for (let i = 0; i < root.children.length; i++) {
preorderFn(root.children[i])
}
}
}
preorderFn(root)
return arr
};
2.迭代法,
- 定义一个数组来记录遍历节点值,用个栈记录需要迭代的数据
- 循环遍历栈元素,每次弹出栈顶节点,记录栈顶节点值,
- 如果栈顶元素有子节点,从后往前遍历,依次入栈,这样就可以确保每次栈顶元素都是子元素的第一位
- 循环结束条件为栈为空
代码
/**
* // Definition for a Node.
* function Node(val, children) {
* this.val = val;
* this.children = children;
* };
*/
/**
* @param {Node|null} root
* @return {number[]}
*/
var preorder = function(root) {
if (!root) return []
let arr = []
let stack = []
stack.push(root)
while(stack.length) {
let top = stack.pop()
arr.push(top.val)
if (top.children) {
let len = top.children.length
for (let i = len - 1; i >= 0; i--) {
stack.push(top.children[i])
}
}
}
return arr
};