前端算法(60)

46 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

题目

给你二叉树的根节点 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
}