持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第8天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode 103. 二叉树的锯齿形层序遍历 】- JavaScript(DFS)
题目描述
给你二叉树的根节点
root,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[20,9],[15,7]]
DFS深度优先搜索
思路分析:
整体的的思路:题目分析后可以发现题目的思路就是遍历,要么深度优先遍历,要么广度优先遍历。关键点就是取决于分层,如果是深度优先就可以利用level来分层,广度优先的话就可以用一个for循环当前队列的size这个小技巧来实现分层。这里使用深度优先搜索的思路来做。具体实现:首先通过dfs去遍历每一个节点就将其值存进结果数组中相应的位置,所以在遍历每一个节点的时候,都要记录节点当前的层数。然后根据层数和结果数组下标的关系,就能找到要存到结果数组中的第几个子数组。存的时候判断层数的奇偶性,来决定是添加到尾部还是插到头部。 如果结果数组中存在这个子数组 就判断奇偶性 决定尾插还是头插 如果没有就初始化一个子数组。
var zigzagLevelOrder = function(root) {
let res = [];
const dfs = (root,level = 0) => {
if( !root ) return;
res[level] ?
level % 2 === 0 ?
res[level].push(root.val) :
res[level].unshift(root.val)
: res[level] = [root.val]
++level;
dfs(root.left,level)
dfs(root.right,level)
}
dfs(root,0);
return res
};
思考
注意点:如果不想让自己翻来翻去或者越翻越乱的话,那么就让二叉树中每一层节点的顺序与队列中的节点顺序保持一致,只是在读取的时候,不同层次间分别从首尾交替读取。当从队列首部进行读取的时候,我们按照左孩子-右孩子的顺序从尾部入队,当从队列尾部进行读取的时候,我们按照右孩子-左孩子的顺序从首部入队。
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤