[路飞]leetcode-107.二叉树的层序遍历-ii

131 阅读1分钟

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)力扣原文

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: [[15,7],[9,20],[3]]

示例 2:

输入: root = [1]
输出: [[1]]

示例 3:

输入: root = []
输出: []

题目详解:倒层序遍历出节点val,

解题1:
层序遍历然后reverse,最为简单粗暴

var levelOrderBottom = function (root) {
  if (!root) return [];
  let queue = [[root, 0]];
  let result = [];
  while (queue.length) {
    let [node, leva] = queue.shift();
    let { val, left, right } = node;
    if (!result[leva]) {
      result[leva] = [];
    }
    result[leva].push(val);
    leva++;
    left && queue.push([left, leva]);
    right && queue.push([right, leva]);
  }
  result.reverse();
  return result;
};

解题2:
两个队列,父队列出队的同时记录子队列,最后将result头部添加一个[],在将父队列等于子队列,子队列等于[]

var levelOrderBottom = function (root) {
  if (!root) {
    return [];
  }
  let result = [[]];
  let parentQueue=[root]
  let childQueue=[]
  while(parentQueue.length||childQueue.length){
      while(parentQueue.length){
        const {val,left,right}=parentQueue.shift()
        result[0].push(val)
        left&&childQueue.push(left)
        right&&childQueue.push(right)
        if(!parentQueue.length&&childQueue.length){
            result.unshift([])
            continue
        }
      }
      
      parentQueue=childQueue
      childQueue=[]
  }
  return result;
};