算法题-二叉树的层序遍历

305 阅读1分钟

题目

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 力扣链接:leetcode-cn.com/problems/bi…

解题思路

  • 层序遍历顺序就是广度优先遍历
  • 要注意在遍历的时候需要记录当前节点所处的层级,方便将其添加到不同的数组中

解题步骤哦

  • 广度优先遍历二叉树
  • 遍历过程中记录每个节点的层级,并将其添加到不同数组中

代码

/**
 * 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 levelOrder = function(root) {
    if (!root) return []
    let q = [[root,0]]
    let res = []
    while(q.length) {
        const [n,l] = q.shift()
        console.log(n.val,l)
        res[l] ? res[l].push(n.val) : res[l] = [n.val]
        n.left && q.push([n.left,l+1])
        n.right && q.push([n.right,l+1])
    }
    return res
};

另一种解题方法

在广度优先遍历的while循环体中可以发现,每次循环是不断把老的节点出队,并把其孩子节点入队的循环过程,如果我们可以保证每次迭代都可以把所有老的节点都出队,并把它们的孩子节点(下一层级的全部节点)都入队,就可以保证while循环体刚进来时是同一层级的所有节点,这样我们就可以将同一层级的节点加到一个数组里从而放进大数组里。

var levelOrder = function(root) {
    if (!root) return []
    let q = [root]
    let res = []
    while(q.length) {
        let len = q.length
        res.push([])
        while(len--){
            const n = q.shift()
            res[res.length-1].push(n.val)
            n.left && q.push(n.left)
            n.right && q.push(n.right)
        }
    }
    return res
};

时间复杂度和空间复杂度

因为我们要遍历这棵树,所以时间复杂度O(n),n为树的节点数 定义了一个q,所以空间复杂度是O(n)