【每日LeetCode】手把手教你刷题之N叉树的前序遍历

651 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情

N叉树的前序遍历

这是力扣第589题

给定一个 n 叉树的根节点  root ,返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔

image.png

image.png

解题思路

这是一道简单题,不过相信很多人第一眼看到这题,认为至少也是一道中等甚至困难难度的题目。其实我一开始也误以为它是一道难题,但是在做了它之后才发现,原来这么简单。接下来就来介绍一下这道看起来难实际简单的题目,分享一下关于这道题目的做题心得。

递归法

首先我们得了解二叉树的遍历,二叉树分为前序、中序、后序遍历,遍历有很多种方式(这里就不多介绍了),其中最经典的就是递归方式了。但是递归比较消耗空间,因此在这里可以通过设置默认值 res,以此来减少空间的损耗。

对于此题,我们可以先利用深度优先遍历,访问根节点,然后再对根节点依次进行遍历,最后返回最终结果即可。

相关代码如下:

var preorder = function(root) {
    var res = []
    if(!root) return res
    else {
        res.push(root.val)
        root.children && root.children.forEach(item=>{ 
            res = [...res,...preorder(item)]
        })
    }
    return res
};

迭代法

介绍完递归法,再来介绍一下迭代法。可以这么说,出现递归的地方,迭代一定不会缺席。那么迭代法的思路是怎么样的呢?

首先需要把根结点作为链表头,然后开始进行循环,遍历并删除链表头,如果存在子节点,就把它的所有子节点添加到链表头部;如果链表为空,就结束循环。这样就完成了对N叉树的遍历。

相关代码如下:

var preorder = function(root) {
    var num = new Array(); 
    if(root == null) {
        return num;
    }
    var p = [root]; 
    while(p.length) {
        let temp = p.shift(); 
        num.push(temp.val);
        if(temp.children) { 
            for(let i = 0; i < temp.children.length; i++) {
                p.splice(i, 0, temp.children[i]);
            }
        }
    } 
    return num;
};

总结

以上就是对 力扣 589 题N叉树的前序遍历 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。