[路飞]_589. N 叉树的前序遍历

102 阅读1分钟

题目介绍 给定一个 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.迭代法,

  1. 定义一个数组来记录遍历节点值,用个栈记录需要迭代的数据
  2. 循环遍历栈元素,每次弹出栈顶节点,记录栈顶节点值,
  3. 如果栈顶元素有子节点,从后往前遍历,依次入栈,这样就可以确保每次栈顶元素都是子元素的第一位
  4. 循环结束条件为栈为空

代码

/**
 * // 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
};