[路飞]107. 二叉树的层序遍历 II

110 阅读2分钟

B站地址

二叉树和二叉搜索树

二叉树中的节点最多只能有两个子节点:一个是左侧子节点,另一个是右侧子节点。这个定义有助于我们写出更高效地在树中插入,查找和删除节点的算法。二叉树在计算机科学中的应用非常广泛。
二叉搜索树BST是二叉树的一种,但是只允许你在左侧节点存储(比父节点)小的值,在右侧节点存储(比父节点)大的值。

二叉搜索树.png 位于树顶部的节点叫做根节点(11)。它没有父节点。树中的每个元素都叫作节点,节点分为内部节点外部节点。至少有一个子节点的节点称为内部节点(7,5,9,15,13和20)是内部节点。没有子元素的节点称为外部节点或叶节点(3,6,8,,10,12,14,18和15是叶节点)。

题目描述

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历) 例如:
给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

返回其自底向上的层序遍历为:

[
  [15,7],
  [9,20],
  [3]
]

解题思路

思考很重要,题目要求我们返回自底向上的层序遍历。我们可以按照正常的自上而下的,每层自左而右层序遍历去遍历树。然后对返回结果反转数组中元素的顺序,可以用reverse()方法

 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrderBottom = function(root) {
    if(!root) return [];
    let queue = [root];
    let result = [];
    while(queue.length){
        let temp = [];
        let size = queue.length;
        for(let i = 0; i < size; i++){
            let n = queue.shift();
            temp.push(n.val);
            n.left && queue.push(n.left);
            n.right && queue.push(n.right);
        }
        result.push(temp);
    }
    return result.reverse();
};

unshift(),将新元素添加到数组的开头,并返回新的长度。
对于最后的返回数据,result.push()方法,可以直接用result.unshift(),最后return result。

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {number[][]}
 */
var levelOrderBottom = function(root) {
    if(!root) return [];
    let queue = [root];
    let result = [];
    while(queue.length){
        let temp = [];
        let size = queue.length;
        for(let i = 0; i < size; i++){
            let n = queue.shift();
            temp.push(n.val);
            n.left && queue.push(n.left);
            n.right && queue.push(n.right);
        }
        result.unshift(temp);
    }
    return result;
};