本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
输入: root = [3,9,20,null,null,15,7]
输出: [[3],[20,9],[15,7]]
题目解析
思路一
先定义一个接收结果数组,然后进行判断如果数据为空则返回空数组,如果不为空则进行存放当前的节点,然后判断是否可以进入循环,在循环中,需要存放下一层节点值和当前层的节点值,在进行遍历,遍历出来的数据需要放在当前层,在进行判断,如果左边不为空则放在下一层的左边,如果右边不为空则放在下一层的右边,如果当前层遍历结束,则加入结果数组中,如果是偶数层,就进行反转,在进行更新当前层信息
/**
* @param {TreeNode} root
* @return {number[][]}
*/
var zigzagLevelOrder = function(root) {
const res = [];
if(!root) return res;
let curLevel = [root];
while(curLevel.length){
const nextLevel = [];
const curVal = [];
for(let node of curLevel){
curVal.push(node.val);
node.left && nextLevel.push(node.left);
node.right && nextLevel.push(node.right);
}
res.push(curVal);
res.length%2===0 && curVal.reverse();
curLevel = nextLevel
}
return res;
};
思路二
我们这里使用递归进行实现,先判断数据是否为空,如果不为空则定义一个接收结果数组进行执行递归函数,递归函数结束条件为数据为空的状态,因为要输出数组,每一层上的节点在一个数组内部,所以在每一层都添加一个数组,在对应level层的数组里面添加遍历到的值,level其实就对应每一层的索引,所以直接用level作为索引可以获得对应层的数组,递归遍历左子树右子树,这时的level已经进入下一层了,最后递归完成之后进行返回
var levelOrder = function(root) {
if(root == null || root ==[]){return []}
let quene = []
insertOrder(root, 0 , quene)
return quene
};
var insertOrder = function(root, level, quene){
if(root == null) {return}
if(quene.length < level + 1){
quene.push([])
}
quene[level].push(root.val)
insertOrder(root.left , level + 1 , quene)
insertOrder(root.right , level + 1 , quene)
return quene
}