持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第29天,点击查看活动详情
N叉树的前序遍历
这是力扣第589题
给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。 n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔
解题思路
这是一道简单题,不过相信很多人第一眼看到这题,认为至少也是一道中等甚至困难难度的题目。其实我一开始也误以为它是一道难题,但是在做了它之后才发现,原来这么简单。接下来就来介绍一下这道看起来难实际简单的题目,分享一下关于这道题目的做题心得。
递归法
首先我们得了解二叉树的遍历,二叉树分为前序、中序、后序遍历,遍历有很多种方式(这里就不多介绍了),其中最经典的就是递归方式了。但是递归比较消耗空间,因此在这里可以通过设置默认值 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叉树的前序遍历 的解法和思路。这是我的一些做题记录,希望可以为正在刷题的你提供一些帮助。如有不足欢迎各位在评论区指正。